Перенаправление URL-адреса htaccess с параметрами GET

#apache #.htaccess #mod-rewrite #url-rewriting

Вопрос:

У меня есть URL-адрес в формате http://www.example.com/?s=query

Я хочу перенаправить этот URL на http://www.example.com/search/query

У меня есть следующее .htaccess , но я хотел проверить, есть ли в этом что-то не так. Мой RewriteRule выглядит немного шатким, и я не знаю, вызовет ли это проблемы для других URL-адресов.

 RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
 

Я провел здесь тест, и, похоже, он перенаправляет на правильный URL.

Комментарии:

1. Для меня все в порядке. Но вам также нужно позаботиться о том, чтобы фактически обрабатывать входящие запросы, используя эту новую форму.

Ответ №1:

 RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
 

Вероятно, вам понадобится флаг NE ( noescape ) в RewriteRule директиве, если вы получаете значение параметра URL с кодировкой%, в противном случае целевой URL-адрес будет закодирован дважды. Переменная QUERY_STRING сервера не декодируется Apache.

Это также зависит от того, как вы переписываете /search/query обратно /?s=query (или, предположительно, больше похоже /index.php?s=query ?) — предположительно, вы уже делаете это позже в конфигурации? Вы хотите, чтобы это перенаправление применялось только к прямым запросам, а не к переписанным запросам (в противном случае вы получите цикл перенаправления). Простой способ убедиться в этом — проверить, что REDIRECT_STATUS переменная env пуста.

Например:

 RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^s=(.*) [NC]
RewriteRule ^$ /search/%1 [NE,QSD,R,L]
 

Другие моменты:

  • QSD Флаг был бы предпочтительнее (в Apache 2.4) для добавления ? в конец строки susbtitution, чтобы удалить строку запроса.
  • Регулярное выражение ^s=(.*) (конечное $ значение было лишним) предполагает, что s это единственный параметр URL в начале строки запроса. В его нынешнем виде предполагается, что все является частью этого значения. например. s=fooamp;bar=1 приведет к /search/fooamp;bar=1 .
  • NC Флаг в RewriteRule директиве является излишним.
  • Вы также должны проверять /index.php?s=<query> ? (Или любой другой файл / DirectoryIndex обрабатывает запрос.)