Москва, Строительный проезд, 7А кор. 4 Работаем: 24/7 +7 495 744 67 74

Директивы сложного перенаправления (mod_rewrite)

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

Данный модуль представляет собой основанный на правилах механизм (синтаксический анализатор с применением регулярных выражений), выполняющий URL-преобразования на лету. Модуль поддерживает неограниченное количество правил и связанных с каждым правилом условий, реализуя действительно гибкий и мощный механизм управления URLURL-преобразования могут использовать разные источники данных, например, переменные серверапеременные окружениязаголовки HTTPвремя и даже запросы к внешним базам данных в разных форматах для получения URL нужного Вам вида .

Директива RewriteCond определяет условие, при котором происходит преобразование. RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы, а также условиям этих дополнительных директив.

Под обратной связью подразумевается использование частей сравниваемых URL для дальнейшего использования, т.е. передачи параметров или для построения нового URL.

$N

(0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond). 

%N

(1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond в текущем наборе условий. 

%{NAME_OF_VARIABLE}

где NAME_OF_VARIABLE может быть одной из ниже приведенных переменных

Ниже приводится список всех доступных переменных %{NAME_OF_VARIABLE} с их кратким описанием. 

 HTTP_USER_AGENT

 Содержит информацию о типе и версии браузера и операционной системы посетителя.

 HTTP_REFERER

 Приводится адрес страницы, с которой посетитель пришёл на данную страницу.

 HTTP_COOKIE

 Список COOKIE, передаваемых браузером.

 HTTP_FORWARDED

 Cодержит IP-адрес прокси-сервера или сервера балансировки нагрузки. 

 HTTP_HOST

 Адрес сервера, например, beget.com . 

 HTTP_ACCEPT

 Описываются предпочтения клиента относительно типа документа. 

 REMOTE_ADDR

 IP-адрес посетителя. 

 REMOTE_HOST .

 Адрес посетителя в нормальной форме — например, rt99.net.ru . 

 REMOTE_IDENT

 Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.ru 

 REMOTE_USER

 Тоже, что и REMOTE_IDENT, но содержит только имя. Пример: kondr 

 REQUEST_METHOD

 Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации. 

 SCRIPT_FILENAME

 Полный путь к веб-странице на сервере. 

 PATH_INFO

 Содержит в себе все, что передавалось в скрипт. 

 QUERY_STRING

 Содержит строчку, переданную в качестве запроса при вызове CGI скрипта. 

 AUTH_TYPE

 Используется для идентификации пользователя 

 DOCUMENT_ROOT

 Cодержит путь к корневой директории сервера. 

 SERVER_ADMIN

 Почтовый адрес владельца сервера, указанный при установке. 

 SERVER_NAME

 Адрес сервера, например, kondr.beget.com 

 SERVER_ADDR

 IP-адрес вашего сайта. 

 SERVER_PORT

 Порт, на котором работает Apache. 

 SERVER_PROTOCOL

 Версия HTTP протокола. 

 SERVER_SOFTWARE

 Название сервера, например, Apache/1.3.2 (Unix) 

 TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME

 Переменные, предназначеные для работы со временем в разных форматах. 

 API_VERSION

 Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h

 THE_REQUEST

 Полная строка HTTP-запроса, отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Она не включает какие-либо дополнительные заголовки отправляемые браузером. 

 REQUEST_URI

 Ресурс, запрошенный в строке HTTP-запроса. 

 REQUEST_FILENAME

 Полный путь в файловой системе сервера к файлу или скрипту, соответствующему этому запросу. 

 IS_SUBREQ

 Будет содержать текст «true», если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями, которым нужно иметь дело с дополнительными файлами или URI для того, чтобы выполнить собственные задачи. 

Условие — это шаблон условия, т.е. какое-либо регулярное выражение, применяемое к текущему экземпляру «Сравниваемая Строка», т.е. «Сравниваемая Строка» просматривается на поиск соответствия Условию. 
Помните, что Условие это perl-совместимое регулярное выражение с некоторыми дополнениями: 

  • Вы можете предварять строку шаблона префиксом ‘!’ для указания несоответствия шаблону.
  • ‘ <Условие ‘ (лексически меньше)
  • ‘>Условие’ (лексически больше)
  • ‘=Условие’ (лексически равно)
  • ‘-d’ (является ли каталогом)
  • ‘-f’ (является ли обычным файлом)
  • ‘-s’ (является ли обычным файлом с ненулевым размером)
  • ‘-l’ (является ли символической ссылкой)
  • ‘-F’ (проверка существования файла через подзапрос)
  • ‘-U’ (проверка существования URL через подзапрос)
  • Все эти проверки также могут быть предварены префиксом восклицательный знак (‘!’) для инвертирования их значения.

    RewriteEngine включает или выключает работу механизма преобразования. Если она установлена в положение off, этот модуль совсем не работает. Заметьте, что по умолчанию настройки преобразований не наследуются. Это означает, что вы должны иметь RewriteEngine on директиву для каждого виртуального хоста, в котором вы хотите использовать этот модуль.
    Синтаксис RewriteEngine выглядит следующим образом: 

    RewriteEngine on | off    # По умолчанию RewriteEngine off

    Используйте для комбинирования условий в правилах OR вместо AND. Типичный пример — перенаправление запросов на поддомены в отдельные каталоги. 

    RewriteEngine on    RewriteCond %{REMOTE_HOST} ^mysubdomain1.* [OR]  RewriteCond %{REMOTE_HOST} ^mysubdomain2.* [OR]  RewriteCond %{REMOTE_HOST} ^mysubdomain3.*  RewriteRule ^(.*)$ ^mysubdomain_public_html/$1    RewriteCond %{REMOTE_HOST} ^mysubdomain4.*  RewriteRule ^(.*)$ ^mysubdomain4_public_html/$1  

    Для выдачи главной страницы какого-либо сайта, согласно «User-Agent:» заголовку запроса, Вы можете использовать следующие директивы: 

    RewriteEngine on    RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*  RewriteRule ^/$ /homepage.max.html [L]    RewriteCond %{HTTP_USER_AGENT} ^Lynx.*  RewriteRule ^/$ /homepage.min.html [L]    RewriteRule ^/$ /homepage.std.html [L]

    Для выдачи разных сайтов для разных браузеров, согласно «User-Agent:» заголовку запроса, Вы можете использовать следующие директивы: 

    RewriteEngine on    RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*  RewriteRule ^(.*)$ /mozilla/$1 [L]    RewriteCond %{HTTP_USER_AGENT} ^Lynx.*  RewriteRule ^(.*)$ /lynx/$1 [L]    RewriteRule ^(.*)$ /default/$1 [L]

    Общий синтаксис директивы RewriteRule выглядит следующим образом: 

    RewriteRule Шаблон Подстановка [flag]    # flag - необязательное поле указывающее дополнительные опции

    В подстановке вы можете использовать, в том числе, и специальные флаги путем добавления в качестве третьего аргумента директивы RewriteRule. Флаги — это разделённый запятыми следующий список флагов:

    ‘redirect|R [=code]’ 

    (вызывает редирект)

    Префикс в Подстановке вида http://thishost[:thisport]/ (создающий новый URL из какого-либо URI) запускает внешний редирект (перенаправление). Если нет никакого кода, в подстановке ответ будет со HTTP статусом 302 (ВРЕМЕННО ПЕРЕМЕЩЕН). Для остановки процесса преобразования вам также нужно написать флаг ‘L’

    ‘forbidden|F [=code]’ 

    (делает URL запрещенным)

    Это делает текущий URL запрещённым, например, клиенту немедленно отправляется ответ с HTTP статусом 403 (ЗАПРЕЩЕНО). Используйте этот флаг в сочетании с соответствующимиRewriteConds для блокирования URL по некоторым критериям.

    ‘gone|G [=code]’ 

    (делает URL «мёртвым»)

    Этот флаг делает текущий URL «мертвым», т.е., немедленно отправляется HTTP ответ со статусом 410 (GONE). Используйте этот флаг для маркировки «мертвыми» несуществующие более страницы. 

    ‘proxy|P [=code]’ 

    (вызвает прокси)

    Этот флаг помечает подстановочную часть как внутренний запрос прокси и немедленно (т.е. процесс преобразования здесь останавливается) пропускает его через прокси-модуль. Используйте этот флаг для того, чтобы добиться более мощной реализации директивы ProxyPass, интегрирующей некоторое содержимое на удаленных серверах в пространство имён локального сервера. 

    ‘last|L [=code]’ 

    (последнее правило)

    Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований.

    ‘next|N [=code]’ 

    (следуюший раунд)

    Перезапустить процесс преобразований (начав с первого правила). В этом случае URL снова сопоставляется неким условиям, но не оригинальный URL, а URL вышедший из последнего правила преобразования. Используйте этот флаг для перезапуска процесса преобразований, т.е. безусловному переходу на начало цикла.

    ‘chain|C [=code]’ 

    (связь со следующим правилом)

    Этот флаг связывает текущее правило со следующим (которое, в свою очередь, может быть связано со следующим за ним, и т.д.). Это имеет следующий эффект: если есть соответствие правилу, процесс продолжается как обычно, т.е. флаг не производит никакого эффекта. Если правило не соответствует условию, все следующие, связанные правила, пропускаются.

    ‘type|T=MIME-тип [=code]’

    (принудительно установить MIME тип)

    Принудительно установить MIME-тип целевого файла в MIME-тип. К примеру, это можно использовать для имитации mod_alias директивы ScriptAlias, которая принудительно устанавливает для всех файлов внутри отображаемого каталога MIME тип равный «application/x-httpd-cgi».

    ‘nosubreq|NS [=code]’

    (используется только в случае не внутреннего подзапроса)

    Этот флаг дает команду механизму преобразований пропустить директиву, если текущий подзапрос является внутренним подзапросом. К примеру, внутренние подзапросы в Apache происходят тогда, когда mod_include пытается получить информацию о возможных файлах по умолчанию для каталогов (index.xxx). При подзапросах это не всегда полезно и даже иногда вызывает проблему в работе набора директив преобразований. Используйте этот флаг для исключения некоторых правил.

    ‘nocase|NC [=code]’

    (не учитывать регистр)

    Это делает Шаблон нечувствительным к регистру, т.е. нет различий между ‘A-Z’ и ‘a-z’, когда Шаблон применяется к текущему URL.

    ‘qsappend|QSA [=code]’

    (добавлять строку запроса)

    Этот флаг указывает механизму преобразований на добавление, а не замену, строки запроса из URL к существующей, в строке подстановки. Используйте это когда вы хотите добавлять дополнительные данные в строку запроса с помощью директив преобразований. 

    ‘noescape|NE [=code]’

    (не экранировать URI при выводе)

    Этот флаг не даёт mod_rewrite применять обычные правила экранирования URI к результату преобразования. Обычно, специальные символы (такие как ‘%’, ‘$’, ‘;’, и так далее) будут экранированы их шестнадцатиричными подстановками (‘%25’, ‘%24’, и ‘%3B’, соответственно); этот флаг не дает это делать.

    Если в подкаталогах в .htaccess нет ни одной директивы модуля mod_rewrite, то все правила преобразования наследуются из родительского каталога.

    При наличии в файле .htaccess каких-либо директив модуля mod_rewrite не наследуется ничего, а состояние по умолчанию выставляется таким же, как в главном конфигурационном файле веб-сервера (по умолчанию «off»). Поэтому, если нужны правила преобразования для конкретного каталога, то нужно еще раз вставить директиву «RewriteEngine on» в .htaccess для конкретного каталога.

    При наследовании правил из верхних каталогов и добавлении к ним новых свойственных только данному каталогу — необходимо выставить в начале следующее: «RewriteEngine on» и «RewriteOptions inherit» — последняя директива сообщает серверу о продолжении. 


    адрес

    г. Москва, Строительный пр., 7Ак4

    телефон

    +7 495 744 67 74Круглосуточно
    Яндекс.Метрика

    Если у Вас есть вопросы, жалобы или предложения по работе нашей компании, напишите нам Нам важно любое мнение. Спасибо.