apache – 查询string重写规则将条件附加到URL

在试图重写

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包含#(片段标识符),请确保放置? 在它之前