Сентябрь 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, можно создавать всевозможные обработки запросов и преподносить их в удобоваримом виде.
Полезные ссылки:
- ModRewrite документация
- веб-сервер Apache
- книга: Регулярные выражения (Regular Expressions)
Автор: Сергей Яценко
Комментарии
- 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 allServerName мой сайт
ServerAlias мой сайт мой сайт
DocumentRoot мой сайтгде не так?
- 19. 26.03.10 02:51 От: Myload
-
Как сделать через .htaccess
это name.com/images/foto.gif
на name.com/foto.gif ?