Простое и краткое объяснение логики редиректов .htaccess правил

Пожалуй самое простое и понятное изложение логики написания правил редиректов (Rewrite Rule) для .htaccess — для сервера Apache — в этой статье. Буквально на одной странице всё четко изложено (так что оставлю здесь для себя — в продолжении статьи).

А та нестандартная задача, которую я хотел решить для себя — это редирект favicon и других иконок в разные папки, в зависимости от разных доменов или поддоменов (alias-ов). Вот получившееся решение:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteRule ^(favicon\.ico|apple-touch-icon\.png|apple-touch-icon-precomposed\.png)$ favicons/%1/$1 [L]

Соответственно, иконки должны храниться в папках favicons/example.com/, для другого поддомена или алиаса — в favicons/subdomain.example.com/ и так далее. И при заходе на разные псевдонимы сайта быдут выдаваться разные иконки. Очень удобно для мультисайтов на одном исходном php коде.

Ну а вот теория с указанного выше сайта:

Редиректы осуществляются с помощью модуля mod_rewrite. Задаются правила преобразований в виде следующей конструкции:


<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

  [СЮДА ПИШЕМ ПРАВИЛА]  

</IfModule>

Правила преобразования записываются в таком виде:


RewriteCond [СТРОКА ДЛЯ СРАВНЕНИЯ] [УСЛОВИЕ] [ФЛАГИ]
RewriteCond [СТРОКА ДЛЯ СРАВНЕНИЯ] [УСЛОВИЕ] [ФЛАГИ]
RewriteRule [ШАБЛОН] [СТРОКА ПОДСТАНОВКИ] [ФЛАГИ]

Строки RewriteCond — задают условия для срабатывания следующего за ними правила RewriteRule. Условий может быть несколько, они накладываются по правилу AND. Но можно изменить правило на OR с помощью флага OR.

В качестве [СТРОКИ ДЛЯ СРАВНЕНИЯ] могут использоваться различные переменные. Ссылка на полный список Я приведу только те, которые нужны чаще всего:

%{REQUEST_URI} Строка запроса (без доменного имени, и GET параметров), пример «/server/htaccess/»
%{HTTP_HOST} Доменное имя, например «max22.ru»
%{QUERY_STRING} Строка GET параметров

[УСЛОВИЕ] также как и [ШАБЛОН] представляют собой perl совместимое регулярное выражение, с некоторыми дополнениями, позволяющими например проверить файл ли это, или существующий url.

[ФЛАГИ] Флаги пишутся в квадратных скодках через запятую: [NC,OR]. Флаги для условий:

NC Регистронезависимая проверка
OR Условие сопостовляется с остальными про правилу ИЛИ

Подвыражения в регулярных выражениях (заключенные в скобки), доступны для вставки в [СТРОКУ ПОДСТАНОВКИ], обращаться к подвыражениям нужно так: %N — для подвыражений в условиях (RewriteCond) и $N — для подвыражений в правилах (RewriteRule), где N — порядковый номер подвыражения.

RewriteRule — правило подстановки. Если запрос подходит под вышестоящие проверки и [ШАБЛОН], то применяется правило подстановки. Здесь регулировать поведение также можно с помощью флагов. Флаги есть разные, приведу наиболее часто используемые:

NC Регистронезависимая проверка
R=301 Будет редирект с кодом 301, можно указать другой код
L Это последнее правило, больше не применять правил преобразований

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *