Сентябрь 10, 2002

ModRewrite в помощь usability

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

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

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

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

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

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

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

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

Options Indexes FollowSymlinks MultiViews RewriteEngine On # добавляем AllowOverride All Order allow,deny Allow from all

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

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

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

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

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

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

Разберёмся. Строкой ^([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] в конце строки:

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

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

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

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

Разберёмся. Команда 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 даёт указания обрабатывать следующие команды 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, можно создавать всевозможные обработки запросов и преподносить их в удобоваримом виде.

Полезные ссылки:

Автор: Сергей Яценко

Комментарии

1. 10.01.05 01:30 От: Сергей

Спасибо вашей статье! Сайт http://www.vistlan.ru заработал благодаря ей, а везде такое написано...

2. 03.06.05 20:13 От: boombick

Огромный респект!
Все толково и внятно!!!

3. 16.07.05 19:49 От: Михаил, michael_minin@mail.ru

У меня нет такого фацла: httpd.conf

4. 24.08.05 03:34 От: Ruslan

Есть такая проблема

Когда делаю запрос типа
http://reklama.vn.ua/catalog/1_1.html

выполняется два запроса на сервере
1.http://reklama.vn.ua/catalog/1_1.html reff=
2.http://reklama.vn.ua/catalog/ reff=http://reklama.vn.ua/catalog/1_1.html
И самое интересное что в браузер выводится первый запрос.
(обрабатывается всё в http://reklama.vn.ua/index.php/1_1.html)
В index.php организовал вывод в файл, таким образом и обнаружив проблему


Сайт организован на mod_rewrite ниже конфигурация

httpd.conf

RewriteEngine On
RewriteBase /
RewriteRule ^rus/(.*)$ /index.php/$1
RewriteRule ^view/(.*)$ /index.php/$1
RewriteRule ^catalog/(.*)$ /index.php/$1

5. 24.08.05 03:35 От: Ruslan

Если кто знает как лечится, напишите плиз на мыло admin{@}reklama.vn.ua

6. 18.11.05 12:26 От: S.F.W.

СПАСИБО!

7. 29.11.05 19:18 От: VectArt

Да, хорошая статья :)

8. 08.12.05 22:37 От: Stan

Автор, молодец. Действительно супер. Непонятно только, почему комментарии к статье начинаются с января 2005. Судя, по URL, три года статья держалась в секрете. :)

9. 09.01.06 18:29 От: Grolin

огроменное спасибо автору! больше статей хороших и разных! :)

10. 11.01.06 15:11 От: cherry

далаю сейчас проект по созданию хостов для юзеров (пример 3. описанный выше).
Вот пока в условиях локалхоста у меня такой код в .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.localhost$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)

То бишь при обращенни к примеру к http://alex.localhost должно редиректить мне на http://localhost/alex. Не работает. Если кто ответит и укажет на ошибку - огромное спасибо.
с уважением.

11. 11.01.06 15:16 От: cherry

не всё дописал, извиняйте:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.localhost$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.localhost(.*) /$1$2

12. 22.05.06 14:43 От: Valdisss

А вот у меня ни хрена не сработало, подскажите почемуэ.

index.php полностью пустой.

Подставляю ссылку, она и остаётся замены не происходит.

13. 21.08.06 23:25 От: serj

спасибки. коротко и толково. все сразу заработало. фэнкс

14. 16.01.07 19:03 От: Артем

Спасибо за подробную статью!
Ейск WebMoney - http://www.wmeisk.ru

15. 11.05.07 21:33 От: crea3y

спасибо большое за толковое объяснение! Всем бы так...

16. 20.11.07 13:30 От: Аноним

Вам не кажеться что эта функция перегружает сервер? Так оно и есть!

17. 13.12.07 15:24 От: Антон

Спасибо

www.namemail.ru - Именная почта

18. 26.08.08 16:25 От: Я

Хоть убейте не работает, скрипт одной из портальных систем пишет, что у меня не включен
RewriteEngine
хотя в httpd.conf раскоментировано:
LoadModule rewrite_module modules/mod_rewrite.so
в файле
httpd-vhosts.conf
прописано:

Options Indexes FollowSymlinks MultiViews
RewriteEngine On # добавляем
AllowOverride All
Order allow,deny
Allow from all

ServerName мой сайт
ServerAlias мой сайт мой сайт
DocumentRoot мой сайт

где не так?

19. 26.03.10 02:51 От: Myload

Как сделать через .htaccess
это name.com/images/foto.gif
на name.com/foto.gif ?

Ваш комментарий

Обсудить на форуме?

Подумайте, прежде чем высказать своё мнение. Постарайтесь сделать свой комментарий полезным для других. Не используйте ненормативную лексику. Пользователи, пишущие "от нечего делать" бессмысленные наборы символов, будут блокироваться навсегда.