У меня есть веб-приложение на базе PHP, на которое я пытаюсь применить mod_rewrite от Apache.
Исходные URL-адреса имеют форму:
http://example.com/index.php?page=home&x=5
И я хотел бы преобразовать их в:
http://example.com/home?x=5
Обратите внимание, что при переписывании имени страницы я также эффективно «перемещаю» вопросительный знак. Когда я пытаюсь это сделать, Apache с радостью выполняет этот перевод:
RewriteRule ^/([az]+)\?(.+)$ /index.php?page=$1&$2 [NC,L]
Но он $_GET
переменные $_GET
в PHP. Например, вызов http://example.com/home?x=88
дает только одну переменную $_GET
( page => home
). Где x => 88
идти? Однако, когда я изменяю свое правило, чтобы использовать амперсанд, а не знак вопроса:
RewriteRule ^/([az]+)&(.+)$ /index.php?page=$1&$2 [NC,L]
вызов, подобный http://example.com/home&x=88
будет работать так же, как я ожидал бы (т.е. переменные page
и x
$ _GET устанавливаются соответствующим образом).
Разница минимальна, я знаю, но мне хотелось бы, чтобы мои URL-переменные начинались с вопросительного знака, если это возможно. Я уверен, что это отражает мое непонимание того, как mod_rewrite перенаправляет взаимодействие с PHP, но похоже, что я должен это сделать (так или иначе).
Заранее спасибо!
Ура,
-Крис
Попробуй это:.
RewriteCond %{REQUEST_URI} !^/index.php RewriteRule ^/([az]+)(?:$|\?(?:.+)) /index.php?page=$1 [NC,L,B,QSA,NE]
B избегает обратной ссылки (не обязательно, поскольку она соответствует [az] +, но в случае, если вы хотите продлить ее позже, это может быть полезно).
EDIT: добавлен RewriteCond. EDIT 2: QSA заботится о добавлении амперсанда.