Сопоставьте вопросительный знак в регулярном выражении правила mod_rewrite

StackOverflow https://stackoverflow.com/questions/822421

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хочу переписать 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 как есть.Как мне этого добиться?

Это было полезно?

Решение

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

Итак, ваше правило должно выглядеть следующим образом:

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

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

Другие советы

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

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

В дополнение к использованию флага перезаписи 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top