在试图重写
site-search.html?searchword=search%20term
如
advanced-search#q=search%20term
我总是以advanced-search#q=%3Fsearchword%3search%20term
%3Fsearchword%3部分被神秘地添加到正好在search词之前的生成的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 =”之后,我没有什么不同。 无论如何也会发生同样的错误或轻微的变化。
RewriteRule的%1来自相同的RewriteRule的(。*)条件,并且将查询string与URI本身一起匹配。
解决scheme1:将第二个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]
解决scheme2:探索RewriteRule的[QSA]标志,它将整个查询string附加到您的结果uri。 (不适用于Apache 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中防止原始查询string被重述。 如果您正在运行Apache 2.4,则可以通过将QSD标志传递给rewire规则来获得相同的结果。
另外,如果目标URL包含#(片段标识符),请确保放置? 在它之前