#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 обрабатывает запрос.)