Сопоставьте вопросительный знак в регулярном выражении правила mod_rewrite
-
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