ModRewrite в помощь usability

Что такое mod_rewrite и с чем его едят

Так вкратце можно охарактеризовать данную статью. В материале затронута настройка и основные принципы работы модуля mod_rewrite. Примеры снабжены подробными объяснениями.

С ростом сложности веб-приложений появляется необходимость в создании различных комманд от пользователя, или запросов. Как правило, это достигается при помощи создания необходимого URL, например, такого вида:

http://localhost/index.shtml?page=1&book=28&lpg=15&hf=&ac=list&tmpl=stat&m=1&tmpl=newsall

Подобные запросы пользователь Интернет видит каждый день. Более того, подсознательно он пытается их запоминать, чтобы впоследствии изменять его вручную, добиваясь нужной информации от сайта. Но посмотрите ещё раз на этот URL: что-нибудь понятно? Почти нет. Легко ли запомнить такой адрес — нет. Приятно ли наблюдать этот набор букв и цифр в адресной строке браузера? Тоже нет.

Как решить эту проблему? Существует несколько способов избежать использования громоздких URL. Я постараюсь рассмотреть один из них, самый правильный, на мой взгляд: ModRewrite. Так называется дополнительный модуль для популярного веб-сервера Apache, доля которого на рынке веб-серверов составляет более 70%. Этот модуль содержится в стандартной поставке сервера. Но как правило, он обычно отключен.

Для начала, убедимся, что ModRewrite включен. Для этого, откроем конфигурационный файл сервера Apache — httpd.conf в любом текстовом редакторе и найдём такие строки:

#AddModule mod_rewrite.c
и
#LoadModule rewrite_module modules/mod_rewrite.so

Если перед ними находится символ # — удалите его и перезапустите сервер. Модуль начнет функционировать.

Далее необходимо «включить» ModRewrite для конкретного вебсайта. Для этого в этом же файле, httpd.conf, в разделе описания конфигурации вебсайта добавляем такую команду:

RewriteEngine On

Например, в описании виртуальной директории:

<Directory D:/Internet/web/rewr/>
Options Indexes FollowSymlinks MultiViews
RewriteEngine On # добавляем
AllowOverride All
Order allow,deny
Allow from all
</Directory>

Включить ModRewrite можно и при помощи файла локальных настроек сайта — .htaccess. Пример содержимого .htaccess:

order allow,deny
allow from all
Options -Indexes
RewriteEngine On # добавляем

Самое главное мы сделали. Теперь рассмотрим несколько примеров того, что нам может дать ModRewrite.

Пример 1. Новости

Предположим, на вашем сайте доступ к новостям осуществляется посредством такого запроса:

http://localhost/index.php?show=news&year=2002&month=9&day=7

В результате мы отображаем новости за 7 сентября 2002г. Оформим это запрос при помощи ModRewrite, чтобы он выглядел как:

http://localhost/news/2002/9/7/

Изменим файл .htaccess следующим образом:

...
RewriteEngine On
# добавляем
RewriteRule ^([a-z]+)/([0-9]*)/([0-9]*)/([0-9]*)/$ /index.php?show=$1&year=$2&month=$3&day=$4

Разберёмся. Строкой ^([a-z]+)/([0-9]*)/([0-9]*)/([0-9]*)/$ мы задаём формат нового запроса — /news/2002/9/7/. (Эта строка — не что иное, как Regular Expression, мощный формат для записи шаблонов текста и поиска по нему.) $1,$2,$3,$4 — пронумерованные результаты поиска в строке запроса.

Строка /index.php?show=$1&year=$2&month=$3&day=$4 — это запрос, который мы используем внутренне, для удобства программирования. Как видим, он остался прежним, но пользователь (!) уже не увидит его. Для него доступ к новостям теперь будет осуществляться в удобном виде — /news/2002/9/7/.

В целях отладки лучше изменить команду RewriteRule, добавив [R] в конце строки:

RewriteRule ^([a-z]+)/([0-9]*)/([0-9]*)/([0-9]*)/$ /index.php?show=$1&year=$2&month=$3&day=$4 [R]

Тогда после запроса /news/2002/9/7/ в адресной строке мы увидим наш старый URL /index.php?show=news&year=2002&month=9&day=7. [R] даёт команду ModRewrite перенаправить (redirect) запрос.

Пример 2. Подмена страницы в зависимости от браузера

Иногда возникает необходимость «подсовывать» разные страницы в зависимости от пользовательского браузера.

Изменим файл .htaccess:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^page.html$ page_mozilla.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^page.html$ page_lynx.html [L]
RewriteRule ^page.html$ page_other.html [L]

Разберёмся. Команда RewriteCond — это условие для ModRewrite, означающее, что подстановка RewriteRule будет осуществлена только при соблюдении вышестоящего условия RewriteCond. В данном случае, браузерам, определяющим себя как Mozilla, при запросе файла page.html будет отдана страница page_mozilla.html. Пользователям Lynx — страница page_lynx.html. Всем остальным будет показана страница page_other.html. Директива [L] (last) даёт указания прекратить обработку дальнейших комманд ModRewrite.

Пример 3. Виртуальные домены для пользователей

Предположим, что необходимо создать под-домен для каждого пользовательского каталога вашего сайта: чтобы адрес вида http://www.website.net/vasya/ (где vasya — пользовательский каталог) выглядел как http://www.vasya.website.net/.

Посмотрим на необходимую конфигурацию .htaccess:

RewriteCond %{HTTP_HOST} ^www.[^.]+.website.net$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^www.([^.]+).website.net(.*) /$1$2

Разберёмся. Условие RewriteCond даёт указания обрабатывать следующие команды RewriteRule только в том случае, если запрос имеет вид http://www.vasya.website.net/ (HTTP_HOST — это переменная сервера Apache, содержащая в себе текущий хост, или домен). Далее следует правило для обработки подкаталогов, например http://www.vasya.website.net/about/. Директива [C] (chain) означает, что следующая команда RewriteRule будет выполнена только при условии выполнения предыдущей команды. В результате, запросив адрес http://www.vasya.website.net/about/, мы получим содержимое страницы, находящейся по адресу http://www.website.net/vasya/about/.

Такая организация пользовательских каталогов помогает избежать создания многочисленных виртуальных хостов, что очень удобно, если пользователей десятки и сотни.

Резюме. Изучив более подробно механизм ModRewrite, а также синтаксис Regular Expression, можно создавать всевозможные обработки запросов и преподносить их в удобоваримом виде.

Сергей Яценко

Рекомендуем почитать:
Примеры использования модуля mod_rewrite
Прячем счетчик
Создание вкладок c помощью HTML


2 комментариев

  1. iZet 06.09.2010

    вот немного не понятно с «Пример 3»

    распишите плиз по подробнее куда сохраняется 'vasya' и как оно подставляется. В RewriteRule на второй строке я не увидел подстановки...

    и вобще, можно очень подробно с паузами что означает вобще вторая строка RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

  2. Георгий 17.09.2010

    Проблема такая:

    Написал генератор ЧПУ

    77.241.165.34/test/produc...mp;product_id=55

    из этой ссылки генерируется ссылка

    77.241.165.34/test/Produc...iproduct-555-P55

    С=категория

    Р=продукт

    ну и тут у меня возникла проблема обработки этой ссылки

    htaccess файл такого содержания у меня

    RewriteEngine On

    RewriteBase /test

    # Подмена числовых URL-адресов

    RewriteRule ^Products/(C ([0-9]*)/Р([0-9]*))\.html$ /product.php?category_id=$1&product_id=$2 [L]

    # Подмена URL-адресов с ключевыми словами

    RewriteRule ^Products/(.*-С([0-9]+)/.*-Р([0-9]+))\.html$ /product.php?category_id=$1&product_id=$2 [L]

    ну и вот не работает это преобразование ... в чём косяк не понимаю!!!

    кто может помогите.

Оставить комментарий: