Соответствующий вопросительный знак в регулярном выражении правила mod_rewrite - PullRequest
21 голосов
/ 05 мая 2009

Я ищу переписать 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 как есть. Как мне это сделать?

Ответы [ 3 ]

34 голосов
/ 05 мая 2009

Вы должны использовать флаг [QSA] вместо попытки переписать строку запроса. [QSA] передает строку запроса на переписанный URL.

Итак, ваше правило должно выглядеть так:

...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]

Ваш случай очень похож на пример, приведенный для использования флага QSA в поваренной книге mod_rewrite .

10 голосов
/ 05 мая 2009

Запрос не является частью пути URL и поэтому не может быть обработан с помощью директивы RewriteRule . Это можно сделать только с помощью директивы RewriteCond (см. %{QUERY_STRING}).

Но , как уже сказал Чад Бёрч , достаточно установить флаг QSA , чтобы автоматически добавить исходный запрошенный запрос к новому URL.

2 голосов
/ 23 мая 2016

Помимо использования флага перезаписи 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...