Делаем Человеко Понятные Урлы (ЧПУ) с помощью mod_rewrite
Четверг, 25 Мар 2010 11:30Так как преобразование в ЧПУ осуществляется с помощью регулярных выражений, а это целый язык, требующий изучения, то в этой статье хотел бы рассказать о самым популярных форматах преобразования. Но сначала немного теории.
Mod_rewrite — мощный Apache-модуль, который входит в состав дистрибутива. Как же происходит замена URL? Работа модуля осуществляется по принципу «на лету». То есть когда пользователь обращается по ЧПУ-адресу, модуль сразу же проверяется адрес, который замаскирован под ЧПУ, и обращается к ниму. Естественно, посетитель этих манипуляций не замечает и ему кажется, что он обратился по адресу, который ввёл в адресную строку браузера. Какие же преимущества имеют ЧПУ-адреса?
- Более приятен для посетителей, так как адрес лучше запоминается.
- Безопасность, так как посетитель не знает реального адреса.
- ЧПУ, содержащие название статьи, лучше для SEO
Активация модуля mod_rewrite
Как я уже сказал, модуль включён в стандартный дистрибутив, поэтому нам всего лишь нужно его активировать. Активация происходит в .htaccess. Итак, приступим. Открываем наш файл .htacces или создаём, если его нет. Прописываем следующую директиву:
RewriteEngine on
Отлично, теперь наш модуль активен и мы можем приступить в преобразованиям. Рассмотрим первый формат.
Статический ЧПУ-адрес с одной переменной
Итак, в этой статье я говорил, что сайты на PHP и MySQL имеют адреса следующего формата:
Как правило, такие адреса называют динамическими. Вот мы сейчас и займёмся преобразованием динамических адресов в ЧПУ.
Допустим, нужно преобразовать из lis.php?id=3 в bols3.hi. Регулярное выражение будет иметь следующий формат:
RewriteRule ^НАЗВАНИЕ СТРАНИЦЫ([0-9]+)\.РАСШИРЕНИЕ$ ИМЯ НАСТОЯЩЕГО АДРЕСА.php?ПЕРЕМЕННАЯ=$НУМЕРАЦИЯ
То есть в нашем случае получаем следующее:
RewriteRule ^bols([0-9]+)\.hi$ lis.php?id=$1
Теперь вместо адреса lis.php?id=90 (где 90 — id) мы можем спокойно обращаться к bols90.hi.
Статический ЧПУ-адрес с множеством переменных
Рассмотрим такую ситуацию, когда нужно преобразовать адрес с множеством переменных. Например, из lis.php?id=345&cat=3 в bols345-3.hi. Ситуация похожая, но сейчас используется две GET-переменные. В качестве разделителя используется тире. Получаем следующее выражение:
RewriteRule ^bols([0-9]+)-([0-9]+)\.hi$ lis.php?id=$1&cat=$2
Графически сам принцип преобразования будет выглядить следующим образом:
Архивный ЧПУ-адрес
Многие архивы на сайте имеют адрес archive.php?year=2003&month=10. Мы же преобразуем его в archive/2003/10/. Получаем следующую строку:
RewriteRule ^archive/([0-9]+)/([0-9]+)\$ archive.php?year=$1&month=$2
ЧПУ-адрес для тегов
Сейчас теги присутствуют почти на каждом блоге и сайте. Попробуем изменить адрес для тега winter - posts.php?tag=winter в posts/tags/winter/. Имеем следующее выражение:
RewriteRule ^posts/tags/([0-9]+)\$ posts.php?tag=$1
Кстати, для индексации страниц с динамическими адресами поисковые системы применяют отдельный алгоритм. Я не знаю чем он отличает от обычного, но ЧПУ-преобразования, опять же, помогают указать роботу, что нужно индексировать наш адрес, как обычную статическую страницу.