mod_rewrite用查询字符串重定向URL

时间:2012-12-12 01:25:53

标签: mod-rewrite query-string

我搜索了遍布stackoverflow,但没有一个答案似乎适用于这种情况。我的httpd.conf文件中已经有很多工作的mod_rewrite规则了。我刚刚发现Google已将其中一个未重写的网址编入索引,其中包含查询字符串:

http://domain.com/?state=arizona

我想使用mod_rewrite对此网址进行301重定向:

http://domain.com/arizona

问题在于,在我的重写规则中,第二个URL被重写以将查询变量传递给WordPress。它最终被重写为:

http://domain.com/index.php?state=arizona

哪个是正确的功能。到目前为止我尝试的所有东西要么根本没有用,要么让我进入无休止的重写循环。这就是我现在所拥有的,它被困在一个循环中:

RewriteCond %{QUERY_STRING} state=arizona [NC]
RewriteRule .*   http://domain.com/arizona [R=301,L]
#older rewrite rule that passes query string based on URL:
RewriteRule ^([A-Za-z-]+)$ index.php?state=$1 [L]

这给了我一个无休止的重写循环并带我到这个URL: http://domain.com/arizona?state=arizona

然后我尝试了这个:

RewriteRule .*   http://domain.com/arizona? [R=301,L]

删除了URL中的查询字符串,但仍然创建了一个循环。

2 个答案:

答案 0 :(得分:1)

好的,添加第二个RewriteCond最终修复它 - 现在正确重写并且没有循环:

# redirect dynamic URL: ?state=arizona
RewriteCond %{QUERY_STRING} state=arizona [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteRule .*   http://domain.com/arizona? [R=301,L]
# older rewrite rule that passes query string based on URL:
RewriteRule ^([A-Za-z-]+)$ index.php?state=$1 [L]

以下是使其适用于任何州值的代码,而不仅仅是亚利桑那州:

RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{QUERY_STRING} ^state=([A-Za-z-]+)$ [NC]
RewriteRule .*   http://domain.com/%1? [R=301,L]

答案 1 :(得分:0)

RewriteCond %{REQUEST_URI} ^/\?state=arizona$ [NC]

应该是

RewriteCond %{QUERY_STRING} state=arizona [NC]

request_uri结束于?令牌。