我正在使用Apache2和mod_rewrite来隐藏我的查询字符串。这些是有问题的规则。
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule (.*) /search/%1 [R=301,L]
RewriteRule ^search\/?$ /search/?query=test [R=301,L]
当我访问/search
(或/search/
)时,我被正确地重定向到/search/?query=test
(根据最后一条规则)
从那里,RewriteCond
和RewriteRule
应该启动并将我重定向到/search/test
,对吧?根据我的理解,我的第一个%1
中的RewriteRule
对应(.*)
中应包含RewriteCond
的{{1}}。
然而,实际发生的事情是我被重定向到test
。因此,该规则有效,但由于某种原因附加了查询字符串。 QSA选项是以某种方式/某处自动添加的吗?
然后我陷入无限循环重定向到/search/test/?query=test
,因为第一个/search/test?query=test
和RewriteCond
再次启动,并且再次启动......
我做错了什么?!
谢谢!
答案 0 :(得分:11)
您需要指定empty query in the substitution以防止将原始请求的查询附加到新网址:
修改查询字符串
默认情况下,查询字符串不会更改。但是,您可以在包含查询字符串部分的替换字符串中创建URL。只需在替换字符串中使用问号,即表示应将以下文本重新注入查询字符串。如果要删除现有查询字符串,请仅使用问号结束替换字符串。要组合新旧查询字符串,请使用[QSA]标志。
所以:
RewriteCond %{QUERY_STRING} ^query=(.*)$
RewriteRule (.*) /search/%1? [R=301,L]