Назад | Перейти на главную страницу

apache - правило перезаписи строки запроса добавляет условие к URL

Пытаясь переписать

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-адрес содержит # (идентификатор фрагмента), обязательно поместите? перед этим