Я бы изменил ответ Гранта на «Да, это будет работать в основном , как и ожидалось».
В частности, поведение 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']
вернет "about" в вашем скрипте, а не "contact". Чтобы решить эту проблему, используйте вместо этого переменную QUERY_STRING
:
RewriteRule /contact /index.php?%{QUERY_STRING}&p=contact
Это гарантирует, что $_GET['p']
будет всегда возвращать "контакт" при использовании этого правила, независимо от того, портят ли ваши посетители ваши URL-адреса. : -)