Match Question Mark в модуле mod_rewrite regex
Я хочу переписать URL-адреса с несколькими подстроками. Одна подстрока запрашивается как подкаталог, в то время как любые другие запрашиваются как обычные параметры строки запроса.
Например, я хотел бы переписать URL-адреса из
http://www.mysite.com/mark/friends?page=2
к
http://www.mysite.com/friends.php?user=mark&page=2
Я могу выполнить это, за исключением символа вопросительного знака. Вот мое правило перезаписи:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L]
Если я изменил вопросительный знак на любой другой символ, он отлично работает. Похоже, проблема заключается в том, что "?" символ интерпретируется неправильно как начало новой строки запроса.
Мне нужно передать любые параметры, которые появляются после /user/friends как есть. Как это сделать?
Ответы
Ответ 1
Вы должны использовать флаг [QSA]
вместо того, чтобы пытаться переписать строку запроса. [QSA]
передает строку запроса на перезаписанный URL.
Итак, ваше правило должно выглядеть так:
...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]
Ваш случай очень похож на пример, приведенный для использования флага QSA в кулинарной книге mod_rewrite.
Ответ 2
Запрос не является частью пути URL и, следовательно, не может быть обработан с помощью директивы RewriteRule
. Это можно сделать только с директивой RewriteCond
(см. %{QUERY_STRING}
).
Но как уже сказал Чад Бирч, достаточно установить флаг QSA
автоматически получить исходный запрошенный запрос, добавленный к новому URL-адресу.
Ответ 3
В дополнение к использованию флага перезаписи QSA вы также можете использовать переменную окружения QUERY_STRING, как показано ниже:
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING}
И рассматриваемый URL
http://www.example.com/mark/friends?page=2
будет переписано (как указано):
http://www.example.com/friends.php?user=mark&page=2