Apache Mod Rewrite. Правила и примеры
Модуль mod_rewrite
предназначен для использования правил перенаправления запросов к Apache
по условиям. Например для создания ЧПУ (как еще называют псевдостатики) и прочих редиректов, ограничения доступа, подмены параметров в URL. В статье приведены правила и частые примеры использования mod_rewrite
Этот модуль был придуман и написан еще в апреле 1996 и эксклюзивно подарен The Apache Group в июле 1997.
Активация модуля
Чтобы активировать этот модуль необходимо выполнить команду:
sudo a2enmod rewrite
Или создать символическую ссылку файла rewrite.load
:
из /etc/apache2/mods-available
в /etc/apache2/mods-enabled
что, в принципе, одно и то же. Также необходимо разрешить использование mod_rewrite
для virtualhosts
(All
или FileInfo
):
<Directory />
# ...
AllowOverride All
# ...
</Directory>
Пример .htaccess
Создаем в корне сайта файл .htaccess
. Этот файл можно можно использовать также и во вложенных подкаталогах. Пример этого файла с проверкой условия, что модуль mod_rewrite загружен:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# ...
</IfModule>
Синтаксис mod_rewrite
Шпаргалка по mod_rewrite (PDF).
СПОСОБ_ПРЕОБРАЗОВАНИЯ ПРАВИЛО_ПРЕОБРАЗОВАНИЯ [ДОПОЛНИТЕЛЬНЫЕ_ПАРАМЕТРЫ]
Способы преобразования
RewriteCond
- условие, при выполнении которого будет проверяться следующее правило. Пример, проверки на тип браузера (если Firefox то правилоRewriteRule
расположенное ниже сработает):RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule
- подменитьURL
согласноRegExp
выражению;RewriteMap
;
Правила преобразования
Правило преобразования URL содержит 2 выражения разделённые пробелами или табом ЧТО (условие сравнения) КУДА (адрес назначения) перенаправить. Правила преобразования будет проще понять из следующего синтаксиса:
СПОСОБ УСЛОВИЕ_СРАВНЕНИЯ КУДА_НАПРАВИТЬ [ДОПОЛНИТЕЛЬНО]
При описании УСЛОВИЯ СРАВНЕНИЯ доступны переменные сервера, окружения, HTTP-заголовки, время и запросы к внешним базам данных.
Например для доступа к переменной сервера HTTP_HOST
используется такая конструкция: %{HTTP_HOST}
.
Примеры:
%{QUERY_STRING} - строка запроса
Запомните важные моменты:
- URL перенаправления всегда задаются относительно каталога, в котором расположен
.htaccess
; - Описывая путь к файлу (каталогу) первый слэш указывать не нужно;
- При описании правила преобразования разделять условия «ЧТО» и «ЧЕМ» заменяется можно и пробелом и табуляцией;
- Файлы всегда имеют больший приоритет чем правила перенаправления! Например если есть каталог
module/
, а в этом каталоге файлpage.html
, то не получится перенаправитьhttp://domain.com/module
. ПосколькуApache
наталкивается на каталогmodule/
и не будет обрабатывать ваше правило. - Возможны некоторые ограничения регулярных выражений (
PCRE
) доApache 2.0
. Лучше использовать такие аналогии:\d
как0-9
,\w
какa-zA-Z_-
etc..;
Дополнительные параметры
В доп. параметрах устанавливаются флаги (несколько параметров записываются через запятую):
- L - аналог оператора break, прервать проверку следующих правил;
- NC - не учитывать регистр при сравнении условий;
- OR - если это условие не выполняется, проверяется следующее за ним;
- U - проверка существования URL;
- F - проверка существования файла;
- QSA (query string append) - добавлять строку запроса (все, что после '?')
- Еще флаги;
Примеры
Перенаправить все запросы media/*
в другой каталог uploads/media/
:
RewriteRule ^media/(.+)$ uploads/media/$1
Запрос вида http://site.net/shop/50/
будет рассматриваться сервером как http://site.net/index.php?dir=shop&s=50
:
RewriteRule ^([A-Za-z]+)/([0-9]+)$ index.php?dir=$1&s=$2 [L]
301-й редирект:
RewriteRule ^index.html$ index.php
Адрес без www:
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
Запретить доступ для IP адресов 89.19.99.99 и 156.68.54.122:
RewriteCond %{REMOTE_ADDR} ^(89\.19\.99\.99)$ [OR]
<code>RewriteCond %{REMOTE_ADDR} ^(156\.68\.54\.122)$
RewriteRule ^/* http://www.site.com.ua/deny.html [L]
Перенаправление на информационную страницу (при обновлении например):
RedirectMatch 302 ^/ /informer.php
Передать входящие GET параметры можно так:
RewriteRule ^path/([\d]+).*$ http://site.com/index.php?split=$1&%{QUERY_STRING} [R=301,L]
#apache, #rewrite, #redirect