mod_rewrite с вопросительными знаками и амперсандами (с PHP) - PullRequest
4 голосов
/ 16 мая 2010

У меня есть веб-приложение на основе PHP, к которому я пытаюсь применить mod_rewrite Apache.

Исходные URL имеют вид:
http://example.com/index.php?page=home&x=5

И я хотел бы преобразовать их в:
http://example.com/home?x=5

Обратите внимание, что при переписывании имени страницы я также эффективно "перемещаю" знак вопроса. Когда я пытаюсь это сделать, Apache с радостью выполняет этот перевод:

RewriteRule ^/([a-z]+)\?(.+)$ /index.php?page=$1&$2  [NC,L]

Но это портит переменные $_GET в PHP. Например, вызов http://example.com/home?x=88 возвращает только одну переменную $_GET (page => home). Куда ушел x => 88? Однако, когда я изменяю свое правило на использование амперсанда, а не вопросительного знака:

RewriteRule ^/([a-z]+)&(.+)$ /index.php?page=$1&$2  [NC,L]

вызов, подобный http://example.com/home&x=88, будет работать так, как я ожидал (т.е. переменные page и x $ _GET установлены соответственно).

Разница минимальная, я знаю, но я бы хотел, чтобы мои переменные URL начинались с вопросительного знака, если это возможно. Я уверен, что это отражает мое собственное недопонимание того, как перенаправления mod_rewrite взаимодействуют с PHP, но, похоже, я должен быть в состоянии сделать это (так или иначе).

Заранее спасибо!
Cheers,
-Крис

1 Ответ

7 голосов
/ 16 мая 2010

Попробуйте это:.

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^/([a-z]+)(?:$|\?(?:.+)) /index.php?page=$1 [NC,L,B,QSA,NE]

B избегает обратной ссылки (не нужно, поскольку она соответствует [a-z] +, но если вы захотите расширить ее позже, это может быть полезно).

РЕДАКТИРОВАТЬ: добавлен RewriteCond. РЕДАКТИРОВАТЬ 2: QSA заботится о добавлении амперсанда.

...