如何关闭 QSA? (查询字符串追加)

Posted

技术标签:

【中文标题】如何关闭 QSA? (查询字符串追加)【英文标题】:How can I turn off QSA? (query string append) 【发布时间】:2011-04-28 13:30:35 【问题描述】:

我正在使用 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(根据最后一条规则)

从那里,RewriteCondRewriteRule 应该启动并将我重定向到 /search/test,对吗?据我了解,我的第一个RewriteRule 中的%1 对应于RewriteCond 中的(.*),它应该包含test

但是,实际发生的是我被重定向到/search/test/?query=test。因此,该规则有效,但由于某种原因附加了查询字符串。 是否以某种方式/某处自动添加了 QSA 选项?

然后我陷入了重定向到/search/test?query=test 的无限循环,因为第一个RewriteCondRewriteRule 再次启动,一次又一次……

我做错了什么?!

谢谢!

【问题讨论】:

【参考方案1】:

您需要指定 empty query in the substitution 以防止将原始请求的查询附加到新 URL:

修改查询字符串

默认情况下,查询字符串原封不动地传递。但是,您可以在包含查询字符串部分的替换字符串中创建 URL。只需在替换字符串中使用问号来指示应将以下文本重新注入到查询字符串中。当您想删除现有的查询字符串时,只用问号结束替换字符串。要组合新旧查询字符串,请使用 [QSA] 标志。

所以:

RewriteCond %QUERY_STRING ^query=(.*)$
RewriteRule (.*) /search/%1? [R=301,L]

【讨论】:

以上是关于如何关闭 QSA? (查询字符串追加)的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 301 重定向 - 删除查询字符串 (QSA)

htaccess 中的 [QSA, L] 中的 L 是啥

如何使用 stringstream 在循环中追加?例如[关闭]

如果字符串是唯一的,则Php追加到文件[关闭]

htaccess 重定向附加查询字符串?

oracle SQL查询中,如何在where中用条件语句,判断不同情况,追加不同的And条件?