mod_rewrite:重定向到GET变量中命名的页面

时间:2017-10-25 00:35:21

标签: apache .htaccess mod-rewrite

我正在更改网站上的目录/网址结构,使其更易读(当然,非常好),而且我遇到了麻烦。假设我有以下URI请求:

http://example.com/page.php?foo=bar&baz=qux

如果有人为旧URI添加了书签,我想将.htaccess中的请求重定向到由foo变量确定的页面,如下所示:

http://example.com/bar

这可能吗?如果是这样,我该怎么做?

修改

这是一个更具体的例子。我曾经有一个名为cc.php的页面。它使用两个参数调用:curriculumtitle。因此,查询可能看起来像cc.php?curriculum=lesson1&title=First%20Steps。这显然非常难看,所以我想将其重定向到/lesson1

我删除了旧的cc.php并创建了一个新的index.php,用于根据请求URI确定要显示的课程。如果访问者访问/lesson1,则会通过以下规则自动知道该怎么做:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]`

然而,有人有可能将旧的cc.php计划加入书签,所以如果有人这样做,我希望能够重写新方案。我尝试过以下规则:

RewriteCond %{QUERY_STRING} ^curriculum=(.*)&title=(.*)$
RewriteRule ^cc.php$ %1

虽然这会将cc.php?curriculum=lesson1&title=some_title正确地重定向到/lesson1,但 将与之前的规则一起使用

如何让两套规则都有效?我想到的另一个解决方案是让cc.php根据header()调用$_GET['curriculum'],但这看起来很难看。

1 个答案:

答案 0 :(得分:0)

您需要在规则中使用重定向标记 [R] ,以便将请求从旧网址格式外部重定向到新网址。

 RewriteCond ℅{QUERY _STRING} ^curriculum=([^&]+)&title=(.*)$
 RewriteRule ^cc.php$ %1? [L,R]

 RewriteCond {REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]