Как сохранить существующую строку запроса в правиле mod_rewrite - PullRequest
4 голосов
/ 06 октября 2009

Я пытаюсь переписать URL с:

http://domain.com/aa/whatever/whatever.php
до
http://domain.com/whatever/whatever.php?language=aa

Однако, в зависимости от существующих переменных $ _GET, это может быть либо? Language, либо & language.

Для этого я использую 2 регулярных выражения с флагом [L]:

RewriteRule ^([a-z]{2})/(.*\.php\?.*) /$2&language=$1 [L]
RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [L]

Второй работает, как и ожидалось ... Первый, однако, никогда не попадает (он попадает ко второму регулярному выражению, которое поражает), хотя тренер по регулярным выражениям действительно показывает мне, что должен.

редактирование:

Если вы только что прочитали, мне нужно использовать две обратные косые черты, чтобы избежать знака вопроса. Если я сделаю это, он попадет в первое регулярное выражение, но никогда не найдет другие переменные GET.

Ответы [ 2 ]

9 голосов
/ 06 октября 2009

Из документации для mod_rewrite шаблон в RewriteRule сопоставляется с частью URL после имени хоста и порта, а также перед строкой запроса, поэтому строка запроса не включается. Вот почему вы не получаете другие переменные.

Чтобы добавить новый параметр строки запроса language=xx, сохраняя при этом любую существующую строку запроса, вам необходимо использовать флаг QSA (строка запроса добавляется). С этим флагом достаточно одного правила, основанного на вашем втором случае:

RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [QSA]
0 голосов
/ 06 октября 2009

Вы можете настроить перезапись URL-адреса для передачи языка в скрипт php через элемент PATH_INFO суперглобального $ _SERVER. Просто передайте язык сценарию так:

foobar.php/en?args

В этом случае $ _SERVER [PATH_INFO] будет равно / en

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...