.htaccess url重写查询字符串

时间:2013-02-12 07:35:36

标签: php .htaccess url-rewriting

好的,我已经在这里阅读并搜索了一些但是没有找到我的问题的答案,或者我可能对于重写url而言太新了,只是无法弄明白。这就是我想要完成的事情:

我有一个包含频道说明和ID的表格,该ID用于了解要显示的内容,因此我的网址中有这样的内容

http://www.mysite.com/page?channel=1

现在我想做的是显示:

http://www.mysite.com/page/description

仍然能够以某种方式获取该描述的ID以显示适当的内容。希望这是有道理的。我唯一想到的是在我的页面顶部,做一个:

select * from channels where description = $_GET['description']

并返回id,然后使用它。这是唯一的出路吗?或者.htaccess够好吗?这样的菜鸟:(

编辑:这是我现在的htaccess:

AddType x-mapp-php5 .php
Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
##This is to redirect just stream page only
RewriteRule ^stream/(.+)/([0-9]+)$ /stream.php?channel=$1

2 个答案:

答案 0 :(得分:1)

如果你想获得ID,你可以做下一个:

  1. 启用mod_rewrite apache模块
  2. 在DocumentRoot目录中创建.htaccess
  3. 粘贴下一个:

    RewriteEngine On
    RewriteRule ^([0-9]+)$ /page.php?channel=$1
    
  4. 当您点击网址时:

  5. http://www.mysite.com/1

    您可以从网址获取内容:

    http://www.mysite.com/page?channel=1

答案 1 :(得分:0)

有很多方法可以做到这一点。

在您的应用中使用MVC架构会强制您在一个formanother中使用路由逻辑。

您可以通过多种方式完成您特别需要的工作,包括apache RewriteMap

我个人设计我的应用程序,它接收URI并将它们路由到控制器/页面。这可以确保PHP继续完全控制最终为请求显示的内容。

假设您的任务是美化链接而不影响应用程序的大部分内容,您需要找到一种方法将/page/description映射到/page?channel=1

对于这种独特的情况,我会使用类似于decorator pattern的东西,因为从本质上讲,你的任务不需要修改现有的代码库:

的.htaccess

RewriteEngine On
RewriteRule ^.*$ router.php [NC,L]

router.php

include'config.php';// remove your config loading from index.php

$request = $_SERVER['REQUEST_URI'];
$request = explode('/', $_request);
    # in $request you will have all the uri segments now

/* complex logic to find out what page you're on */

   # assuming we found out it's page/description
$_GET['channel'] = 1;// or getIdFromDescription($request[2])
   # this forces the environment to believe it got a request with ?channel=1

# revert to your old request with injected environment
include'index.php';

这里的前提是index.php可以加载旧页面。而你只需要改变他们的访问方式。因此,您使用路由器将新请求映射到旧请求。

它并不完美,但在设计不佳的应用程序上效果很好。

请注意:我当前的实现不处理静态资源(图像,css,js等)