apache - 查询字符串重写规则将条件附加到 URL

apache - 查询字符串重写规则将条件附加到 URL

在尝试重写

site-search.html?searchword=search%20term 

作为

advanced-search#q=search%20term

我总是以advanced-search#q=%3Fsearchword%3search%20term

%3Fsearchword%3部分内容被神秘地附加到生成的 URL 中,位于搜索词之前。

我制定的规则如下:

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=(.*)$
RewriteRule ^(.*)$ http://www.example.com/advanced-search#q=%1 [R=301,L,NE]

值得一提的是,我在“q=”后面放什么都没有关系。无论如何都会发生相同的错误或 to 的轻微变化。

答案1

RewriteRule 的 %1 来自相同的 RewriteRule 的 (.*) 条件,并且您将那里的查询字符串与 URI 本身进行匹配。

解决方案 1:将第二个 RewriteCond 中的模式移动或复制到 RewriteRule 的条件中。

根据评论和假设您想要达到什么目的,可以像这样:

RewriteCond %{HTTP_HOST} ^(www\.)?domain.com$
RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteRule [?&]searchword=([^&]*) http://www.domain.com/advanced-search#q=%1 [R=301,L,NE]

解决方案 2:探索 RewriteRule 的 [QSA] 标志,它会将整个查询字符串附加到结果 uri。(不适用于 Apache 2.2)

答案2

调整模式以匹配并向目标 URL 添加 ? 后,语法终于按预期工作了。

RewriteCond %{REQUEST_URI}  ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=([^&]+)
RewriteRule ^([^&]+) http://www.domain.com/advanced-search?#q=%1 [R=301,L,NE]

目标 URL 中的 ? 可防止重新声明原始查询字符串。如果您运行的是 Apache 2.4,则可以通过将 QSD 标志传递给重新连接规则来实现相同的结果。

此外,如果目标 URL 包含 #(片段标识符),请确保在其前面放置 ?

相关内容