Apache Mod Rewrite. Правила и примеры

Категория: Linux

Модуль 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).

СПОСОБ_ПРЕОБРАЗОВАНИЯ  ПРАВИЛО_ПРЕОБРАЗОВАНИЯ  [ДОПОЛНИТЕЛЬНЫЕ_ПАРАМЕТРЫ]

Способы преобразования

  1. RewriteCond - условие, при выполнении которого будет проверяться следующее правило. Пример, проверки на тип браузера (если Firefox то правило RewriteRule расположенное ниже сработает):
    RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
  2. RewriteRule - подменить URL согласно RegExp выражению;
  3. 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

категория: Linux