mod rewrite

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

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

Список всех доступных переменных:
  • HTTP_USER_AGENT  Содержит информацию о типе и версии браузера и операционной системы посетителя
  • HTTP_REFERER Приводится адрес страницы, с которой посетитель пришёл на данную страницу
  • HTTP_COOKIE Список COOKIE передаваемых браузером[/color]
  • HTTP_FORWARDED Страница непосредственно с которой перешел пользователь
  • HTTP_HOST Адрес сервера
  • HTTP_ACCEPT Описываются предпочтения клиента относительно типа документа
  • REMOTE_ADDR IP-адрес посетителя
  • REMOTE_HOST Адрес посетителя в нормальной форме
  • REMOTE_IDENT Имя удаленного пользователя. Имеет формат имя.хост
  • REMOTE_USER То-же, что и REMOTE_IDENT, но содержит только имя
  • REQUEST_METHOD Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации
  • SCRIPT_FILENAME Полный путь к вебстранице на сервере
  • PATH_INFO Содержит в себе все, что передавалось в скрипт
  • QUERY_STRING Содержит строчку, переданную в качестве запроса при вызове CGI скрипта
  • AUTH_TYPE Используется для идентификации пользователя
  • DOCUMENT_ROOT Содержит путь к корневой директории сервера
  • SERVER_ADMIN Почтовый адрес владельца сервера, указанный при установке
  • SERVER_NAME Адрес сервера
  • SERVER_ADDR IP-адрес вашего сайта
  • SERVER_PORT Порт на котором работает Apache
  • SERVER_PROTOCOL Версия HTTP протокола
  • SERVER_SOFTWARE Название сервера
  • THE_REQUEST Полная строка HTTP запроса отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Она не включает какие-либо дополнительные заголовки отправляемые браузером
  • REQUEST_URI Ресурс, запрошенный в строке HTTP запроса
  • REQUEST_FILENAME Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу
  • TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME Переменные предназначены для работы со временем в разных форматах

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

RewriteEngine on | off
В подстановке можно использовать, в том числе, и специальные флаги путем добавления в качестве третьего аргумента директивы 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', соответственно); этот флаг не дает это делать.

Список кодов ответа веб сервера:

1xx: Informational (Информационные).

100 Continue (Продолжать).
101 Switching Protocols (Переключение протоколов).
102 Processing (Идёт обработка).

2xx: Success (Успешно).

200 OK (Хорошо).
201 Created (Создано).
202 Accepted (Принято).
203 Non-Authoritative Information (Информация не авторитетна).
204 No Content (Нет содержимого).
205 Reset Content (Сбросить содержимое).
206 Partial Content (Частичное содержимое).
207 Multi-Status (Многостатусный).
226 IM Used (IM использовано).

3xx: Redirection (Перенаправление).

300 Multiple Choices (Множество выборов).
301 Moved Permanently (Перемещено окончательно).
302 Found (Найдено).
303 See Other (Смотреть другое).
304 Not Modified (Не изменялось).
305 Use Proxy (Использовать прокси).
306 (зарезервировано).
307 Temporary Redirect (Временное перенаправление).

4xx: Client Error (Ошибка клиента).

400 Bad Request (Плохой запрос).
401 Unauthorized (Неавторизован).
402 Payment Required (Необходима оплата).
403 Forbidden (Запрещено).
404 Not Found (Не найдено).
405 Method Not Allowed (Метод не поддерживается).
406 Not Acceptable (Не приемлемо).
407 Proxy Authentication Required (Необходима аутентификация прокси).
408 Request Timeout (Время ожидания истекло).
409 Conflict (Конфликт).
410 Gone (Удалён).
411 Length Required (Необходима длина).
412 Precondition Failed (Условие «ложно»).
413 Request Entity Too Large (Размер запроса слишком велик).
414 Request-URI Too Long (Запрашиваемый URI слишком длинный).
415 Unsupported Media Type (Неподдерживаемый тип данных).
416 Requested Range Not Satisfiable (Запрашиваемый диапазон не достижим).
417 Expectation Failed (Ожидаемое не приемлемо).
418 I'm a teapot (Я - чайник).
422 Unprocessable Entity (Необрабатываемый экземпляр).
423 Locked (Заблокировано).
424 Failed Dependency (Невыполненная зависимость).
425 Unordered Collection (Неупорядоченный набор).
426 Upgrade Required (Необходимо обновление).
449 Retry With (Повторить с...).
456 Unrecoverable Error (Некорректируемая ошибка...).

5xx: Server Error (Ошибка сервера).

500 Internal Server Error (Внутренняя ошибка сервера).
501 Not Implemented (Не реализовано).
502 Bad Gateway (Плохой шлюз).
503 Service Unavailable (Сервис недоступен).
504 Gateway Timeout (Шлюз не отвечает).
505 HTTP Version Not Supported (Версия HTTP не поддерживается).
506 Variant Also Negotiates (Вариант тоже согласован).
507 Insufficient Storage (Переполнение хранилища).
509 Bandwidth Limit Exceeded (Исчерпана пропускная ширина канала).
510 Not Extended (Не расширено).

Примеры:

Жесткий запрет посещений нашего веб-сайта для робота поисковой системы Google

RewriteEngine on

RewriteCond %{USER_AGENT} Googlebot
RewriteRule .* - [F]
# Другой вариант возвращает вместо ошибки 403 ( FORBIDDEN ) ошибку 404 ( NOT _ FOUND )

RewriteCond %{USER_AGENT} Googlebot
RewriteRule .* - [R=404]
Закрыть доступ к веб-сайту в рабочее время

RewriteEngine on

RewriteCond %{TIME_HOUR}%{TIME_MIN} > 900
RewriteCond %{TIME_HOUR}%{TIME_MIN} < 1800
RewriteRule .* - [ F ] 
Если на сайте есть очень ценные картинки или архивы и нет желания чтобы кто-то размещал их (если архивы, то ссылки на них) на своих страницах, создавая таким образом бесполезный трафик для вашего сайта, вы можете запретить скачивание ресурсов, проверяя поле заголовка HTTP_REFERER. для каталога:

RewriteEngine on

RewriteBase   /img/
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .* - [ F ] 
и для определенных типов файлов

RewriteEngine on

RewriteBase   /img/
RewriteCond %{HTTP_REFERER} !^$
RewriteRule \.(jpe?g|gif|png|css|swf)$ - [ F ] 
В связи с неоднозначностью записи расширения HTML файлов (.htm или .html), некоторые пользователи могут ошибочно набрать адрес страницы. Для автоматического исправления такого рода ошибок, можно воспользоваться mod_rewrite.

RewriteEngine on

RewriteBase   /
RewriteRule ^(.*)\.htm$  $1.html [R=permanent] 
Необходимо запрос любой страницы сайта отправлять на одну (будет написано что сайт временно ен доступен), но в то же время нужно оставить его открытым для поисковых машин. То есть для клиентов сайт закрыт, а для индексации - открыт.

RewriteEngine on

RewriteBase   /
RewriteCond %{HTTP_USER_AGENT} !^yandex.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^googlebot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^gaisbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^rambler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^aport.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^metacrawler.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^msnbot.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} !^crawler.* [NC,OR]
RewriteRule ^/$ - [L,R] 
Перенаправление несуществующих URL на другой веб-сервер

RewriteEngine on

RewriteBase   /
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule ^(.+) http://webserverB.dom/$1  
Проблема здесь в том, что это будет работать только для страниц находяшихся внутри DocumentRoot. Тогда как вы можете добавить больше условий (например ещё и для управления домашними каталогами, и т.д.) есть лучший вариант:

RewriteEngine on

RewriteBase   /
RewriteCond /your/docroot/%{REQUEST_FILENAME} !-U
RewriteRule ^(.+) http://webserverB.dom/$1  
Прочли: 2179 | Добавлено: 30 июня 2011 | На главную