В попытке переписать
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 =". Та же ошибка или небольшое изменение к произойдут независимо.
После настройки паттена на соответствие и добавления ? к целевому URL, синтаксис, наконец, работает, как и планировалось.
RewriteCond %{REQUEST_URI} ^/site-search\.html$
RewriteCond %{QUERY_STRING} ^searchword=([^&]+)
RewriteRule ^([^&]+) http://www.domain.com/advanced-search?#q=%1 [R=301,L,NE]
The ? в целевом URL не позволяет повторить исходную строку запроса. Если вы используете Apache 2.4, то того же результата можно добиться, передав флаг QSD правилу rewire.
Также, если целевой URL содержит символ # (идентификатор фрагмента), не забудьте поместить ? перед ним
.%1 RewriteRule's %1 приходит из того же самого условия RewriteRule (.*), и вы сравниваете строку запроса там с самим URI.
Решение 1: Переместите или скопируйте ваш паттерн во втором RewriteCond'е в условие RewriteRule's.
Основываясь на комментариях и предположении, чего бы вы хотели достичь, как-то так:
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: исследуем флаг [QSA] RewriteRule, который добавляет всю строку запроса к результирующему uri для вас. (не для Apache 2.2)
.