Гибкая настройка сервера (.htaccess) - часть 2

3 April 2007 – 22:57

В первой части даны основные понятия гибкой настройки сервера через файл .htaccess, перечислены наиболее часто встречающиеся правила. Сегодня расскажу про mod_rewrite, модуль Apache для URL-преобразований, а точнее для динамического преобразования запрашиваемых URL`ов. Для понимания mod_rewrite необходимо в свою очередь знать что такое переменные среды CGI (ссылка ниже) и иметь представление о регулярных выражениях (ссылка ниже), если эти понятия ни о чем вам не говорят, то думать о mod_rewrite еще рано.

Для начала убеждаемся, что mod_rewrite подключен. Проверяем наличие файла mod_rewrite.so, смотрим присутствует ли в httpd.conf строка: LoadModule rewrite_module modules/mod_rewrite.so или спрашиваем у провайдера, подключен ли модуль.

***

При осуществлении преобразований нам понадобятся 5 директив:
RewriteEngine - запуск модуля (on), приостановка преобразований (off)
RewriteOptions - дополнительные опции
RewriteBase - указывает базовый путь для преобразований.
RewriteCond - указывает условия при наличии которых применяется следующая директива RewriteRule.
RewriteRule - набор правил, выделяющие URL, которые будут преобразовыватся.

***

Легче рассмотреть принципы написания URL-преобразований на пошаговом примере. Пример .htaccess для защиты от hotlink (т.е. использования прямых ссылок с других сайтов на файлы вашего сайта site.com):

# установлен ли модуль
<IfModule mod_rewrite.c>

# запускаем модуль
RewriteEngine on

# защищаемся от бесконечного цикла (на случай
# если мы допустили в правилах ошибки)
RewriteOptions MaxRedirects=50

# "/" - обозначает корневой URL, обычно
# соответствует http://вашсайт.ру/
RewriteBase /

# условие читается: "проверить с какого URL
# пришел запрос, если не с site.com [регистр
# не учитывать], то смотрим RewriteRule"
RewriteCond %{HTTP_REFERER} !^http://(www\.)?site\.com/ [NC]

# правило читается: "если запрашиваются файлы
# заканчивающиеся на .jpg или .jpeg или .gif или .png",
# то вместо этих файлов передаем следущий
# урл 'http://www.site.com/img/nohotlink.png' и
# флаг [L] указывает прекратить обработку дальнейших команд
RewriteRule \.(jpe?g|gif|png)$ http://www.site.com/img/nohotlink.png [L]

# закрываем блок
</IfModule>

***

Структура условия:
1) RewriteCond - директива
2) %{HTTP_REFERER} - сравниваемая строка (HTTP_REFERER - переменная среды CGI)
3) !^http://(www\.)?site\.com/ - условие (регулярное выражение)
4) [NC] - флаг ([NC] - не учитывать регистр, [OR] - "или" еще одно условие)

***

Еще пример:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteOptions MaxRedirects=50
RewriteBase /

# 1) Переписываем ссылки вида file.php?var1=hi в /hi/
# 2) И сылки вида file.php?var1=hi&var2=hello&var3=salut
# в /hi/hello/salut/
RewriteRule ^([^/\.]+)/?$ /file.php?var1=$1 [L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ file.php?var1=$1&var2=$2&var3=$3 [L]

# готово!
</IfModule>

***

Полезные ссылки:
Переменные среды CGI
Регулярные выражения
URL Rewriting Guide

Комментировать