В большинстве случаев работа с 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 неверный
4 комментария:
Спасибо! Очень пригодилось. в фароритс блог :)
Спасибо. Как раз то что искал. Теперь буду разбираться. Никогда не делал 404 раньше. Искал инфу по реврайту на реальном примере и заметил что 404 делаеться вообще элементарно. :) Век живи - век учись.
А как делать преобразования УРЛов, если пользователь переходит на сайт по старым (динамическим) УРЛам?
я чет непому автор опечатался или это дейсвительно переделает статические адреса в динамические ???
помойму все стремятся ук тому чтоб пределать динамику в статику
Отправить комментарий