Правила 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может быть строкой, взятой из следующего списка
Шаблон_условия это шаблон условия, регулярное выражение, которое применяется к текущему экземпляру СтрокаТестирования.
СтрокаТестирования сначала оценивается перед сопоставлением с ШаблономУсловия.