我正在更改网站上的目录/网址结构,使其更易读(当然,非常好),而且我遇到了麻烦。假设我有以下URI请求:
http://example.com/page.php?foo=bar&baz=qux
如果有人为旧URI添加了书签,我想将.htaccess
中的请求重定向到由foo
变量确定的页面,如下所示:
http://example.com/bar
这可能吗?如果是这样,我该怎么做?
这是一个更具体的例子。我曾经有一个名为cc.php
的页面。它使用两个参数调用:curriculum
和title
。因此,查询可能看起来像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']
,但这看起来很难看。
答案 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]