Подтвердить что ты не робот

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 как есть. Как это сделать?

4b9b3361

Ответ 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