Ноя
14
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 неверный

tags: ,
posted in Internet, web by yas375

Follow comments via the RSS Feed | Оставить комментарий | Trackback URL

6 Comments to "Пример работы с mod_rewrite"

  1. Anonymous wrote:

    Спасибо! Очень пригодилось. в фароритс блог :)

  2. Zefo wrote:

    Спасибо. Как раз то что искал. Теперь буду разбираться. Никогда не делал 404 раньше. Искал инфу по реврайту на реальном примере и заметил что 404 делаеться вообще элементарно. :) Век живи – век учись.

  3. самогипноз wrote:

    А как делать преобразования УРЛов, если пользователь переходит на сайт по старым (динамическим) УРЛам?

  4. Angrey wrote:

    я чет непому автор опечатался или это дейсвительно переделает статические адреса в динамические ???
    помойму все стремятся ук тому чтоб пределать динамику в статику

  5. Анонимно wrote:

    2Andrey – Нет, автор всё правильно описал. Я тоже по-началу думал, что это бред какой-то :) Прикол в том, что ты передаёшь в урл путь типа site.ru/article, а сервер получает на самом деле динамический путь… в итоге все довольны… пользователь видит статику, а сервер получает динамику.

  6. qwert wrote:

    а как быть например при подключении css и внутренних ссылках на сайте, все ссылки переделывать в абсолютные и путь css стилей переделывать в абсолютный?

Leave Your Comment