Пожалуй самое простое и понятное изложение логики написания правил редиректов (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 | Это последнее правило, больше не применять правил преобразований |