我正在使用 Apache2 和 mod_rewrite 来隐藏我的查询字符串。这些是有问题的规则。
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule (.*) /search/%1 [R=301,L]
RewriteRule ^search\/?$ /search/?query=test [R=301,L]
当我访问时/search
(or /search/
)我被正确重定向到/search/?query=test
(按照最后一条规则)
从那里开始,RewriteCond
and RewriteRule
应该启动并将我重定向到/search/test
, 正确的?据我了解%1
在我的第一次RewriteRule
对应于(.*)
in the RewriteCond
其中应包含test
.
然而,实际发生的是我被重定向到/search/test/?query=test
。因此,该规则有效,但由于某种原因附加了查询字符串。QSA 选项是否以某种方式/某处自动添加?
然后我陷入了重定向到的无限循环/search/test?query=test
因为第一个RewriteCond
and RewriteRule
再一次、再一次、再一次……
我究竟做错了什么?!
Thanks!
您需要指定一个替换中的空查询 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule防止将原始请求的查询附加到新 URL:
修改查询字符串
默认情况下,查询字符串原样传递。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号即可指示以下文本应重新插入查询字符串中。当您想要删除现有查询字符串时,只需用问号结束替换字符串。要组合新旧查询字符串,请使用 [QSA] 标志。
So:
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule (.*) /search/%1? [R=301,L]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)