2009-10-06 3 views
4

Я пытаюсь переписать URL из:Как сохранить существующую строку запроса в правило mod_rewrite

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

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

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

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

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

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

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

ответ

9

С documentation for mod_rewrite картина в RewriteRule соответствует против части URL после имя хоста и порт, а также перед строкой запроса, чтобы строка запроса не была включена. Вот почему вы не получаете других переменных.

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

RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [QSA] 
+0

Нашел его, прежде чем я прочитал ответ, но тем не менее это правильный ответ. –

+2

Спасибо, что приняли ответ, хотя вам удалось найти его сами. – mikej

0

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

foobar.php/en?args 

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

Смежные вопросы