Я бы внес поправки в ответ Гранта на «Да, это будет работать в основном, как и ожидалось».
В частности, поведение mod_rewrite
в отношении существующих строк запроса может быть неожиданным.В качестве примера, давайте рассмотрим следующее правило, которое преобразует URL вы в комплект поставки:
RewriteRule /contact /index.php?p=contact
Это правильно переписать /contact
в /index.php?p=contact
и название страницы будет доступна через $_GET['p']
. Однако, если вы используете этот метод со сценарием, который использует параметры, отличные от названия страницы, он становится немного сложнее. Это правило также переводит /contact?person=Joe
в /index.php?p=contact
. Параметр person=Joe
полностью исчезает! Есть два способа справиться с этим.
Самый простой способ заключается в использовании («строки запроса на добавление») флаг [QSA]
на правиле, которое будет поместить исходную строку запроса после параметров, поставляемых в правиле, перевод /contact?person=Joe
к /index.php?p=contact&person=Joe
:
RewriteRule /contact /index.php?p=contact [QSA]
Однако это может привести к тому, что ваш параметр p=
будет перезаписан. Посещение /contact?p=about
будет переписано до /index.php?p=contact&p=about
, поэтому $_GET['p']
вернет «около» в ваш скрипт, а не «контакт». Чтобы решить эту проблему, используйте переменную QUERY_STRING
вместо:
RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact
Это гарантирует, что $_GET['p']
будет всегда возвращение «контакт» при использовании этого правила, независимо от того, будет ли ваши посетители баловаться с вашей URL. :-)
Теперь серьезно, я единственный, кто замечает здесь, что он пытается конвертировать http://example.com/index.php?p=contact к http://example.com/contact, а не http://example.com/contact к http://example.com/index.php?p=contact, как все здесь делают? –
Я неправильно понял, как это работает, но ответы здесь помогли исправить мое понимание. – VirtuosiMedia