Работа с директивами mod_rewrite в файле .htaccess

Рассмотрим пример этих директив, взятый из файла .htaccess для некоторой cms. В качестве справочника будем смотреть на официальное описание работы mod_rewrite.

Options +FollowSymlinks
RewriteEngine On

RewriteCond %{HTTP_HOST} ^example\.ru$ [NC]
RewriteRule ^(.*)$ http://www.example.ru/$1 [L,R=301]

RewriteBase /

RewriteRule ^\.htaccess$ [F]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(.*)$

RewriteCond %{REQUEST_URI} (.*)/$
RewriteRule ^(.*)/?$ /?$1&%{QUERY_STRING}

RewriteCond %{REQUEST_URI} !\.(.*)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301]

Options +FollowSymlinks переопределяет поведение сервера для символических ссылок. Обычно символические ссылки уже разрешены в файле конфигурации сервера httpd.conf, но если это не так, то эта директива необходима для работы mod_rewrite.

Второй строчкой идет «RewriteEngine On». Когда она включена все дальнейшие директивы тоже выполняются, установка ее в off отключает выполнение всех нижележащих директив. RewriteEngine не наследуется и поэтому ее надо включать во всех файлах httaccess, в которых имеются директивы mod_rewrite.

Следующие две директивы перенаправляют запрос с нашему сайту (example.ru), набранный без префикса «www» к нашему же сайту, но с префиксом «www». Флаг [L] в RewriteRule приводит к отказу от обработки следующих RewriteRule, а флаг [R=301] делает внешнее перенаправление с помощью 301 редиректа. «http://www.example.ru» явно указывает префикс перенаправления.

Далее в нашем примере идет директива «RewriteBase /». Такая установка отменяет базу перенаправления по умолчанию — физического адреса директории, где лежит файл htaccess. Tак как физический адрес обычно не совпадает с URL, то она обычно необходима.

Следующая одиночная директива «RewriteRule ^\.htaccess$ [F]» запрещает доступ к файлу, совпадающему с регулярным выражением «^.\htaccess$» с помощью флага [F]. Смысл регулярного выражения в скобках: ^ — начало строки; \. — символ точка, так как точка является специальным символом, то его экранируют; $ — конец строки.

Следующая цепочка из трех директив «RewriteCond» отменяет перенаправление, если в запросе набран путь к файлу или директории, или путь содержит точку.

Следующая директива «RewriteCond %{REQUEST_URI} (.*)/$» разрешает перенаправление для адресов, оканчивающихся на «/».

Следующая за ними «RewriteRule ^(.*)/?$ /?$1&%{QUERY_STRING}» помещает путь обращения, удовлетворяющий перечисленным условиям в строку запроса. То есть, если будет набран запрос «http://www.example.ru/15/?m=1», что относительно корня сайта равно «15/?m=1», мы получим «/?15&m=1».
В этой директиве представлена хитрая игра знаком вопроса. В первом случае он является специальным символом в регулярном выражении и означает «один или ноль символов». Во втором появлении он означает начало строки запроса.

Последние три директивы перенаправляют все запросы, не имеющие точки внутри и не оканчивающиеся на «/» на тот же URL, но с «/» на конце. Так как редирект здесь также внешний, то цепочка перенаправлений будет выполнена вновь уже для этого URL.
Вообще говоря, это не совсем правильно и здесь правильнее было бы явно указать вместо слэша http://www.example.ru/ — RewriteRule ^(.*)$ http://www.example.ru/$1/ [R=301].

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

Ваш e-mail не будет опубликован.