четверг, 13 ноября 2008 г.

Пример работы с mod_rewrite

В большинстве случаев работа с mod_rewrite сводится к тому, чтобы сделать friendly URLs(дружественные адреса ссылок). Т.е. мы хотим видеть не www.example.com/index.php?page=catalog&razdel=shoes&producer=adidas, а хотим чтобы было www.example.com/catalog/shoes/adidas.html

Теории по mod_rewrite в интернете много, поэтому я приведу небольшой пример, который при необходимости вы можете видоизменить как вам угодно.
Я подразумеваю, что вы знаете, что такое .htaccess. Если не знаете, то welcome to google =)

Ставим цель для нашего примера:

мы хотим чтобы у нас были ссылки такого плана:
www.example.com/catalog/ - показываем разделы каталога
www.example.com/catalog/shoes/ - показываем производителей продукции выбранного раздела (в нашем примере - производителей обуви)
www.example.com/catalog/shoes/adidas.html - показываем продукты производителя (в нашем случае - adidas)

Обрабатывает у нас всё это дело например index.php. Т.е. нам надо передавать серверу соответственно что-то типа такого:
www.example.com/index.php?page=catalog
www.example.com/index.php?page=catalog&razdel=shoes
www.example.com/index.php?page=catalog&razdel=shoes&producer=adidas
Делаем! =)

В .htaccess пишем следующее (пояснения ниже):

RewriteEngine on
RewriteBase /
# html #
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/(.*).html?$ index.php?page=$1&razdel=$2&producer=$3 [NC,L] # page, razdel, producer.html
# folders #
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?page=$1&razdel=$2 [NC,L] # page, razdel
RewriteRule ^([A-Za-z0-9-]+)/?$ index.php?page=$1 [NC,L] # page
RewriteRule ^/?$ index.php [NC,L] # index
# error #
ErrorDocument 404 /404.php

А теперь разберемся подробнее что в каждой строке мы делаем.

RewriteEngine on - включаем mow_rewrite

RewriteBase / - базовый url для преобразований. не знаю как понятнее объяснить. лучше посмотреть вот тут пример. сразу станет понятнее.

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?page=$1&razdel=$2 [NC,L] и аналогичное - это собственно наши правила для ссылок вида www.example.com/catalog/shoes/, т.е. ссылки-каталоги.

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/(.*).html?$ index.php?page=$1&razdel=$2&producer=$3 [NC,L] - а это уже "закос под файл html".

[NC,L] - флаги. NC означает, что регистр не имеет значения. Т.е. www.example.com/catalog/ и www.example.com/cAtALoG/ будут вести к одному и тому же, а именно, в соответствии с нашим правилом, к www.example.com/index.php?page=catalog. L означает, что если это правило подходит под наш URL, то следующие правила не применять, т.е. остановиться. Именно поэтому в этом примере я разместил правила по принципу "от большего количества параметров к меньшему". Т.е. если приходит на сервер запрос www.example.com/catalog/shoes/adidas.html, то выполнение правил в htaccess останавливается на правиле RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/(.*).html?$ index.php?page=$1&razdel=$2&producer=$3 [NC,L]. А если запрос не удовлетворил этому правилу, то проверяется следующее правило и так далее до конца.

Ну и последнее: ErrorDocument 404 /404.php - указываем куда отправлять пользователя в случае если url неверный