Описаны инструкции сложного редиректа с использованием mod_rewrite модуля, содержатся актуальные примеры редиректа. Полученные знания будут достаточны для практического использования инструкций редиректа в htaccess файлах.
Список инструкций редиректа
В отличие от простого редиректа, описанного в статье Инструкции .htaccess, здесь рассказывается о перенаправления запросов с помощью модуля mod_rewrite или, как его нередко называют, вы освоите сложный редирект(от английского redirect — перенаправление). Но прежде чем заняться изучением непосредственно инструкций редиректа, расскажем, как эти инструкции взаимодействуют. Для начала уточним, что mod_rewrite обеспечивает средства для перезаписи(модификации) на лету запрошенных у сервера URL. Не лишним будет знать, что модуль по разному работает в дополнительном файле конфигурации htaccess и основном файле конфигурации httpd.conf. Все, что описано ниже касается работы модуля в файле htaccess.
Перечислим инструкции, используемые при сложном редиректе.
При проведении редиректа основными являются инструкции RewriteRule и RewriteCond, при создании редиректа допускается использовать неограниченное число правил RewriteRule и неограниченное чило условий RewriteCond для каждого правила. Казалось бы логично предположить, что при редиректе вначале проверяются условия RewriteCond, а затем выполняются правила RewriteRule, в действительности же все происходит следующим образом. mod_rewrite перебирает набор правил одно за другим, каждый набор правил состоит из директив RewriteRule, с или без RewriteCond, т.е. цикл обработки начинается с проверки инструкций RewriteRule, и лишь когда запрос соответствует его шаблону, происходит дальнейшая проверка на соответствие условиям RewriteCond.
Инструкция RewriteRule
Первая инструкция, с которой начинается анализ входящего запроса.
Синтаксис инструкции
где
pattern — шаблон для проверки URL запроса на соответствие изменяемым запросам.
substitution — строка, заменяющая входящий URL, если он соответствует шаблону текущего правила. В строке может быть указан:
— путь к нужному ресурсу в файловой системе сервера;
— относительный путь от корневой директории документов(DocumentRoot);
— абсолютный URL;
— тире, которое означает, что соответствующий шаблону путь не требует изменений.
Кроме обычного текста строка позволяет использовать отдельные части шаблона инструкции. Сделать это можно с помощью таких переменных:
— ($N) — ссылки на части шаблона текущей инструкции RewriteRule. Ссылка представляется в виде $N (0 <= N <= 9), которая замещается содержимым соответствующей N группой согласованного шаблона.
— (%N) — ссылки на части согласованного шаблона прошлой инструкции RewriteCond.
— %{VARNAME}) — переменные сервера.
— (${mapname:key|default}) — mapping-function вызовы.
[flags] — флаги для дополнительного управления работой инструкции, представляют собой заключенный в квадратные скобки список символов(или набор символов), разделенных запятыми . Более подробно флаги описаны ниже.
Инструкции могут встречаться несколько раз в файле .htaccess, при этом важен порядок их следования, т.к. каждая инструкция передает результат своих действий на обработку следующей RewriteRule инструкции. Кроме этого, после изменения пути к нужному ресурсу в этой другой директории также может находиться файл htaccess со своими инструкциями перенаправления, которые также будут выполнены. Таким образом входящий запрос перед выдачей клиенту может пройти весьма сложные преобразования, а при некорректном использовании возможны даже их зацикливания.
Флаги инструкции RewriteRule
Для дополнительного управления работой RewriteRule используются различные флаги, приведем список некоторых из них:
- ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ — позволяет при совпадении с шаблоном записывать куки.
- ‘forbidden|F’ — возвращает браузеру клиента отклик 403 FORBIDDEN (запрещено).
- ‘gone|G’ — флаг заставляет возвращать клиенту код 401 (GONE), означающий, что ресурс больше недоступен.
- ‘H|handler’ — предписывает результирующий запрос обрабатывать специальным указанным обработчиком.
- ‘last|L’ — предписывает модулю mod_rewrite прекратить обработку набора правил, т.е. выполнить текущее правило без учета следующих правил.
- ‘nocase|NC’ — предписывает не учитывать регистр букв.
- ‘noescape|NE’ — по умолчанию специальные символы, & и ? конвертируются в свой шестнадцатеричный эквивалент, использование флага [NE] предотвращает такое преобразование.
- ‘qsappend|QSA’ — добавлять строку запроса, флаг предписывает подстроку запроса строки замещения добавлять в существующую строку, а не заменять ее.
- ‘type|T=MIME-type’ — устанавливает MIME тип ответа сервера. Дает тот же результат, что и инструкция AddType.
Подробнее по флагам и особенностям их применения ищите в Интернете или смотрите первоисточник(на английском).
К списку инструкций сложного редиректа.
Инструкция RewriteCond
Определяет условие, при выполнении которого происходит преобразование запроса, для каждой инструкции RewriteRule таких условий может быть одна и более.
Синтаксис инструкции
где
testString — строка, может содержать такие дополнительные конструкции:
— ссылки на части шаблона текущей инструкции RewriteRule в виде $N (0 <= N <= 9). Параметр от $1 дo $9 обеспечивает доступ к сгруппированным частям шаблона RewriteRule, который подлежит дополнительной проверке. Величина $0 дает доступ ко всей строке шаблона.
— ссылки на части шаблона предыдущей инструкции RewriteCond в виде %N (0 <= N <= 9). Параметр от %1 дo %9 обеспечивает доступ к сгруппированным частям шаблона RewriteCond из текущего набора условий. %0 дает доступ ко всей строке шаблона.
— RewriteMap расширения в форме ${mapname:key|default}.
— переменные сервера в форме %{ NAME_OF_VARIABLE }, где NAME_OF_VARIABLE могут быть строками из списка, приведенного в конце статьи.
condPattern — шаблон условия — это регулярное выражение, результат которого применяется к текущему экземпляру строки testString, которая должна быть предварительно вычислена, перед как сравнить ее с condPattern. Перед условием возможно использование знака отрицания(без кавычек) «!» для указания неравенства шаблону. Кроме правил регулярного выражения здесь можно дополнительно применять:
- ‘<condPattern’ — лексикографически предшествует
- ‘>condPattern’ — лексикографически следует
- ‘=condPattern’ — лексикографически равно
- ‘<=CondPattern’ — лексикографически меньше или равно
- ‘>=CondPattern’ — лексикографически больше или равно
- ‘-d’ — проверяет, является ли TestString путем к ресурсу, проверяет существует ли такой и является ли каталогом
- ‘-f’ — проверяет, является ли TestString путем к ресурсу, проверяет существует ли такой файл
- ‘-s’ — проверяет, является ли TestString путем к ресурсу, существует ли и больше ли нуля размер файла.
Это далеко не полный перечень дополнений, кому интересно, ищите в Интернете, мы же можем предложить ссылку на первоисточник(на английском), где приведен полный список.
Примечание. Лексикографический порядок — способ упорядочивания (в данном случае строк) на основе сравнения входящих символов.
[flags] — специальный флаг, необязательный параметр для дополнительного управления, представляет собой список следующих символов, разделенных запятой:
- ‘nocase|NC’ — (no case), флаг предписывает производить проверку без учета регистра символов в строках TestString и CondPattern, т.е. различие между ‘A-Z’ и ‘a-z’ игнорируются, действие на файловую систему и другие ресурсы не распространяется.
- ‘ornext|OR’ — (or next condition) используется для упрощения условий проверки, например,
Пример использования флага [OR].
RewriteCond %{REMOTE_HOST} =host2 [OR]
RewriteCond %{REMOTE_HOST} =host3
RewriteRule …
Без флага [OR] пару условие/правило пришлось бы приводить трижды, т.е. флаг позволяет заменить AND для пары правило + условие на более простое правило RewriteRule и логическое ИЛИ условий RewriteCond.
Кроме того, все проверки можно предварять знаком логического отрицания «!», т.е. возможно инвертирование результата проверки условия.
К списку инструкций сложного редиректа.
Инструкция RewriteBase
Инструкция явно задает базовый URL для перезаписи каталогов.
Синтаксис инструкции
где
URL-path — базовый URL для подстановки в относительные пути перенаправляемых запросов.
После всех преобразований добавляется слева к локальному конечному адресу для создания полного пути к требуемому ресурсу.
Пример использования инструкции.
RewriteBase /
</IfModule>
К списку инструкций сложного редиректа.
Инструкция RewriteEngine
Синтаксис инструкции.
Инструкция разрешает/запрещает использование перенаправления на лету, по умолчанию установлена в off, не наследуется нижестоящими файлами htaccess, поэтому при использовании сложного редиректа ее надо включать в каждом файле htaccess. Инструкцию удобно использовать для запрета применения инструкций редиректа, вместо комментирования многих строк достаточно закомментировать только эту.
Пример использования инструкции.
RewriteEngine On
</IfModule>
Инструкция RewriteOptions
Синтаксис инструкции
где
options — строка опций, может принимать следующие значения:
- inherit — опция позволяет наследовать инструкции родителького каталога + инструкции в текущем файле htaccess.
- MaxRedirects=число — ограничивает максимальное число перенаправлений, опция эффективна для борьбы с зацикливанием.
- AllowAnyURI — когда разрешена, опция снимает ограничения на обрабатываемые адреса ресурсов. В целях безопасности рекомендуется опцию запрещать.
- MergeBase — опция позволяет копировать RewriteBase из того места, где его значение явно указано, в другие поддиректории или места, в которых инструкция явно не приведена.
Пример использования инструкции.
К списку инструкций сложного редиректа.
Примеры инструкций сложного редиректа.
Пример1.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.name.com$ [NC]
RewriteRule (.*) http://name.com/$1 [R=301]
Пример2.
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !-U
RewriteRule (.*) http://www.site.ru/$1 [R]
Пример3.
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP/
RewriteRule ^index\.html$ http://site.com [R=301,L]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com [R=301,L]
Пример4.
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?vash-url\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
#Заменяем путь к изображению на предупреждение
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/stop_image.jpg [L]
К списку инструкций сложного редиректа.
Наименование переменной | Наименование переменной |
---|---|
DOCUMENT_ROOT HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ HTTPS REQUEST_SCHEME |
REMOTE_ADDR CONN_REMOTE_ADDR REMOTE_HOST REMOTE_PORT REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME |