Пытаясь переписать
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 =». В любом случае произойдет та же ошибка или небольшое изменение.
% 1 RewriteRule происходит из того же условия 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. Изучите флаг [QSA] RewriteRule, который добавляет за вас всю строку запроса к результирующему 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-адресе предотвращает повторное изменение исходной строки запроса. Если вы используете Apache 2.4, того же результата можно достичь, передав флаг QSD правилу перепрограммирования.
Кроме того, если целевой URL-адрес содержит # (идентификатор фрагмента), обязательно поместите? перед этим