Cложные перенаправления "mod_rewrite" в .htaccess

Модуль mod_rewrite web-сервера Apache, предназначен для преобразования URL. Моментально перенаправляет заданный URL согласно созданным правилам, которые могут быть заданы в файлах конфигурации сервера или же в контексте файла локальной конфигурации .htaccess. Помимо шаблонных правил, также указываются определенные параметры и условия их выполнения, делая данный модуль мощным инструментом перенаправления запросов. Переменные условий и параметров в написании правил являются переменными окружения Apache, соответственно, это позволяет перенаправлять не только URL внутри отдельного домена, но и управлять перенаправлением имени хоста (например, для склеивания доменов).

Псевдостатические ссылки

В настоящее время, использование модуля mod_rewrite является неким стандартом обработки статических ссылок в движках систем управления сайтом. Для выполнения преобразований запроса сначала производится замена ссылки скриптом, содержащим параметры запроса, а в дальнейшем - обратная замена. Задача модуля, исходя из заданных правил, рассмотреть url и откорректировать первоначальную ссылку на документ скрипта и настройки вызова. В итоге данный скрипт (или их комбинация) получает вызов от веб-сервера в стандартном для скриптов формате, в то время как в браузерах ссылка остается неизменной и как таковые переадресации отсутствуют. Допустим, скрипт фотогалереи сайта допускает использование параметра идентификатора раздел id и раздел page. В ссылках навигации в это время, значение параметра представляется через дефис и добавляется html-расширение. Ссылка для второй страницы следующая: /galery-p2.html, а чтобы получить эту страницу, необходимо обратиться к index.php с условием: id=galery&page=2.

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([a-z]+)\-p([0-9]+)\.html$ index.php?id=$1&page=$2 [L]

Иногда используют другую методику разбора псевдостатики, если ссылки анализирует "основной" скрипт движка.

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]

Вышеуказанное правило демонстрирует, как любое обращение к файлу попадает к скрипту index.php, а он разбирает и обрабатывает запрашиваемую ссылку.

Запросы и их переадресация

Для реализации запросов переадресации и перенаправления применяются методы как внутри самого домена, так и в режиме разных доменов. В данном случае статус с кодом http задается любой, его выбор зависит от желаемого итога перенаправления.

Воплощение переадресации домена на деле (.htaccess при замене домена, склейка)

Чтобы совместить или «склеить» домены, используется следующая подборка правил:

RewriteEngine On
RewriteBase /

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

Данный метод самый приемлемый и в большинстве ситуаций, лучше остановиться на нем. Этот способ преобразования показывает «если имя указанного домена НЕ имеет в начале - newdomain.ru». Таким образом, группа правил привязывается именно к этому домену, в который направляются все запросы. Какое количество и какие именно домены служат алиасами – не имеет значения, все запросы к ним направляют к одному домену. Преобразовывающее правило предлагает «внутренний» URL, переадресовывая посетителя на этот же адрес, находясь внутри домена.

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_HOST} olddomain.ru
RewriteRule (.*) http://newdomain.ru/$1 [R=301,L]

При необходимости перенаправить запрос olddomain.ru в newdomain.ru, сохраняя внутренний URL, проходит обработка любой страницы с переадресацией по первичному адресу в другом домене. Данный подход используется в случаях перемещения сайта на другой домен и хостинг, позволяет сохранить все категории внутреннего дерева. В строке RewriteCond задается метод преобразования. Корень сайта и его директория назначены базой преобразования (RewriteBase) и вся относительная ссылка от корневой папки ресурса, исключая символ корня / воспринимается правилом RewriteRule, как входной шаблон. Этот случай показывает, как берется любая цепочка разных символов, которую включает url и заменяет ее символами $1. Переадресация запроса на уникальный адрес Apache проводится, а после публикуется в заголовке HTTP статус 301 («Moved Permanently»), в поле Location: заголовка помещает сформированный адрес. В итоге, запрос http://www.olddomain.ru/services/page1.php?id=518 переадресуется на адрес http://newdomain.ru/services/page1.php?id=518

Доменное имя канонической формы: mod_rewrite (.htaccess)

Следующая частая ситуация – перелинковка для подтверждения канонической формы доменного имени (с www или без www). Получается, для отображения домена www.site.ru необходима следующая группа правил:

RewriteEngine on
RewriteBase /

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

Это такой случай, где условие преобразования в точности говорит «когда имя хоста НЕ начинается с www». Выполняя данное требование (если запрошен http://site.ru/page1.html), срабатывает правило, которое предоставляет внутренний url для шаблона и перенаправит по аналогичному адресу другого домена с www. Когда мастера желают убрать www в адресе ресурса, применяется следующий код в .htaccess:

RewriteEngine On
RewriteBase /

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

В этом случае, site.ru – и есть само доменное имя Вашего ресурса. Условие с переменной HTTP_HOST (доменное имя) сопоставляется с необходимым (!^site\.ru [NC]), согласно выполнению условия и если HTTP_HOST не приравнивается к Вашему домену (например, site.ru, тогда и возможна переадресация на сам домен site.ru.

URL каталога в канонической форме

Как сделать переадресацию с Url'а без слеша на Url со слешем? (например, site1.ru/page ? site1.ru/page) Метод довольно простой:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*\..*|.*/)$
RewriteRule ^(.*)$ /$1/ [R=301,L]

Некорректные роботы под запретом

Поисковые системы индексируют всю доступную информацию, поэтому не рассматривает вариант скрытия папок или документов. Все мы знаем об увеличении спамерских ботов, их количество растет с каждым днем. Большинство из них не рассматривают стандарты исключений и даже не обращаются к файлу robots.txt. Однаако, можно зафиксировать их имя (User-agent). Преимуществ данного робота не обнаружить, а нагрузки на сервер очевидны. Чтобы сделать недоступным ресурс для такого некорректного бота, рекомендовано пользоваться следующим правилом:

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_USER_AGENT} Someone's-Robot
RewriteRule (.*) - [F,L]

Условие проверяет наличие в переменной окружения HTTP_USER_AGENT строки Vasin-Robot. Если такая строка обнаружена, сработает правило преобразования. Оно очень простое: по любому запросу ничего не пеобразовывать, выдать HTTP-заголовок с кодом статуса «403 Forbidden». Васин робот получит этот заголовок вместо любого запрошенного документа, никакие другие действия выполняться не будут. Если условие строки Someone's-Robot обусловлено переменной окружения HTTP_USER_AGENT, правило преобразования вступает в силу. Данное правило не сложное: при поступлении любого запроса выдается HTTP-заголовок с кодом статуса «403 Forbidden». И на все запросы Someone's-Robot получит этот заголовок вместо нужного ему документа, а другие действия выполнятся не будут.

Правила и их порядок

Сначала может показаться, что очередность следования правилам mod_rewrite ни к чему. Настройки и каждое правило считываются в порядке написания. Когда возникает первое совпадение URL с настройками шаблонных правил, запускается обработка запроса по данному правилу. Исходя из вышеизложенного, отметим, что все правила стоит применять как одно целое и соблюдать четкий принцип следования: -правило блокировки и внесения запрета -правило перенаправления -правило замены динамического URL При нарушении порядка правил возможны сбои в работе скриптов. Это относится и к правилу блокировки и внесения запрета. Только соблюдая очередность, можно получить удовлетворительный результат работы скриптов.

1000 осталось символов
Добавить файлы