Правила htaccess
.htaccess
представляет собой обычный текстовый документ, расширение которого htaccess
.
Данный файл обычно находится в корне сайта, однако Вы можете создавать и дополнительные
.htaccess-файлы
для различных директорий вашего сайта.
Mod_rewrite
- модуль, используемый веб-серверами для преобразования URL'ов. Для того, чтобы сервер принимал команды файла htaccess
, нужно убедится в включении модуля mod_rewrite
через просмотр конфигурации PHP функцией phpinfo()
.
Если нужно вести логи всех операций, выполненных с помощью mod_rewrite
, можно активировать это с
помощью следующей записи в httpd.conf
:
RewriteLog /usr/local/apache/logs/mod_rewrite.log
RewriteLogLevel 1
Модификация URL в htaccess
выполняется с помощью трех директив:
RewriteBase
указывает префикс адресаRewriteCond
проверяет соответствиеRewriteRule
изменяет URL в соответствии с регулярным выражением если все правила соответствия подходятErrorDocument
у сервера Apache имеется стандартная директива обработки ошибок ErrorDocument, которая сопоставляет коду ошибки адрес документа, который будет показан пользователю
Сначала нужно включить Mod_Rewrite, на случай если модуль еще не активен:
RewriteEngine On
Укажем, что в качестве префикса для URL нужно использовать корень:
RewriteBase /
Редирект Redirect
Постоянное перенаправление пользователя и поискового бота на другой адрес, отличный от изначально запрашиваемого.
Redirect код_редиректа /старая_страница /новая_страница
# 301 редирект с index.php на test.php
Redirect 301 /index.php /test.php
Переадресация RewriteRule
Правило преобразования URL, это условие и правило одновременно. Если вы посмотрите на синтаксис RewriteRule
директивы, то увидите, что она содержит условие, которому должен соответствовать текущий URL, что бы это правило преобразования начало выполняться, и само по себе правило преобразования (это то как изменить текущий URL).
К правилу RewriteRule
помимо условия, содержащегося в самом правиле (это условие запускает исполнение самого правила) можно задать дополнительные условия при помощи директив RewriteCond
.
RewriteRule шаблон_поиска строка_подстановки [флаги]
# переадресация со всех запрашиваемых страниц на index.php
RewriteRule .+ index.php
# переадресация со всех запрашиваемых страниц кроме test.php на index.php
RewriteRule !test.php index.php
# переадресация со всех страниц которые заканчиваются на php или html на index.php
RewriteRule \.[phphtml] index.php
# тоже самое но с логическим оператором |
RewriteRule \.(php|html) index.php
# 301 редирект со страницы test.php на index.php через флаг
RewriteRule test\.php index\.php [R=301,L]
шаблон_поиска
условие, выполнение которого запускает исполнение правила, регулярное выражение которое применяется к текущему URLстрока_подстановки
алгоритм изменения URL,правило изменения(преобразования) URL[флаги]
это разделённый запятыми, заглавные спец символы, заключенные в квадратные скобки. Флаги дополняют преобразование URL
Условие RewriteCond
Если для исполняемого правила RewriteRule
существуют дополнительные условия, указанные перед ним в директивах
RewriteCond
, то запускается внутренний цикл для обработки этих дополнительных условий в том порядке, в котором они
перечислены, сверху вниз.
Если из имеющихся для правила дополнительных условий хотя бы одно условие не выполняется это приводит к остановке запущенного процесса исполнения правила, и преобразование над URL, заданное в правиле, не выполняется. Что бы запущенное на исполнение правило выполнилось до конца и изменило URL, необходимо, что бы выполнились все дополнительные условия, указанные в директивах RewriteCond перед этим правилом!
Тут нужно дополнительно пояснить, что директивы RewriteCond
по умолчанию объединены между собой оператором AND
в одно
составное условие. Просто этот оператор не записывается по умолчанию. От сюда и такая логика, что нужно, что бы все
дополнительные условия были истинными (т.к. они объедены через AND
) для удачного завершения преобразования URL.
RewriteCond строка_тестирования шаблон_условия [флаги]
# переадресация с страницы test.php на index.php
RewriteCond %{REQUEST_URI} test\.php
RewriteRule .+ index.php
# переадресация со всех запрашиваемых страниц кроме test.php на index.php
RewriteCond %{REQUEST_URI} !test\.php
RewriteRule .+ index.php
# переадресация со всех страниц которые заканчиваются на php или html на index.php с флагом [OR]
RewriteCond %{REQUEST_URI} \.php [OR]
RewriteCond %{REQUEST_URI} \.html
RewriteRule .+ index.php
Cтрока_тестирования
это строка, которая может содержать следующие расширенные конструкции в дополнение к простому
тексту:
-
Обратные ссылки RewriteRule
это обратные ссылки вида$N (0 <= N <= 9)
. С$1
по$9
обеспечивают доступ к сгруппированным частям (помещённым в скобки) Шаблона из RewriteRule, который является субъектом текущего набора условийRewriteCond
.$0
предоставляет доступ к целой строке, совпавшей с этим Шаблоном -
Обратные ссылки RewriteCond
это обратные ссылки вида%N (0 <= N <= 9)
. С%1
по%9
предоставляют доступ к сгруппированным частям (снова в кавычках). Шаблона из последнего совпавшегоRewriteCond
в текущем наборе условий.%0
предоставляет доступ к целой строке, совпавшей с этим Шаблоном -
Расширения RewriteMap
это расширения в форме${mapname:key|default}
-
Серверные переменные
это переменные вида%{ NAME_OF_VARIABLE }
гдеNAME_OF_VARIABLE
может быть строкой, взятой из следующего списка
Шаблон_условия
это шаблон условия, регулярное выражение, которое применяется к текущему экземпляру СтрокаТестирования.
СтрокаТестирования сначала оценивается перед сопоставлением с ШаблономУсловия.