在尝试重写
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 包含 #(片段标识符),请确保在其前面放置 ?