Библиотека сайта rus-linux.net
Реальные примеры использования mod_rewrite
Оригинал: Real World Cases For Apache's mod_rewriteАвтор: Андерсон Силва (Anderson Silva)
Дата: август 2009 г.
Перевод: Сергей Супрунов
Дата перевода: 14 августа 2009 г.
Технологии - забавная штука. Временами вам хочется написать о чём-то, поделиться с кем-нибудь своими знаниями, но чтобы сделать это, и сделать хорошо, вы чувствуете, что нужно объяснить ещё массу технологий, используемых для обеспечения работы того, о чём вы собираетесь написать.
Эта статья не разъясняет, как работает mod_rewrite
. Если бы это было так, мне, вероятно, пришлось бы написать и о таких вещах как
протокол HTTP,
HTTP-сервер Apache, регулярные выражения и некоторых других.
Но ведь чтобы водить автомобиль, не обязательно знать, как он работает, начиная с основ физики вообще и заканчивая его механикой, правда? Поэтому в данной статье мы не будем касаться того, что находится "под капотом" модуля mod_rewrite
. Вместо этого мы сосредоточимся на вопросах его настройки и использования.
Итак, для чего годится mod_rewrite
? Он обеспечивает очень быстрый, довольно гибкий и потенциально сложный способ управлять адресами ресурсов (URL) на стороне сервера, используя правила на основе регулярных выражений. Вы можете проверять HTTP-запросы по ряду различных критериев, таких как серверные переменные, заголовки HTTP и др.
Я не уверен насчёт остальных дистрибутивов Linux, но в моей Fedora сервер Apache сразу устанавливается с загружаемым, но отключенным модулем mod_rewrite
.
Чтобы активировать его, просто добавьте в httpd.conf
следующую строку:
RewriteEngine On
Если вы используете несколько виртуальных хостов на сервере, вы можете активировать mod_rewrite
только для нужных хостов.
Если при использовании регулярных выражений вы почувствуете себя не слишком уверенно, не волнуйтесь - их очень просто освоить. Чтобы слегка упростить жизнь, mod_rewrite
поддерживает встроенное протоколирование, чтобы помочь администратору в отладке правил.
Чтобы активировать запись в лог-файл, добавьте в конфигурацию следующие строки:
RewriteLog /var/log/httpd/rewrite.log RewriteLogLevel 5
По крайней мере, таким образом вы, приступая к работе с этим модулем, будете готовы к отладке.
Четыре практических примера
1. Компания, в которой вы работаете, разослала некоторые маркетинговые публикации, и кто-то обнаружил, что ссылка на ваш веб-ресурс, напечатанная на обложке этого документа, содержит ошибку. Предположим, что она должна выглядеть так: http://www.yourcompany.com/ask_me_how/
. А в печать ушло http://www.yourcompany.com/ask-me-how/
. Это, вероятно, наиболее распространённый, почти классический, пример использования mod_rewrite
: получив URL, перенаправлять пользователя на другой. Вот как мы можем исправить вышеозначенную проблему:
RewriteRule ^ask-me-how/$ /ask_me_how/ [R,L]
2. Сайт вашей компании размещается в двух доменах: www.yourcompany.com
и www.yourcompany.net
. Шеф, выполняя поиск в Google, обратил внимание на то, что результаты трактуются как относящиеся к двум различным сайтам. Он хочет, чтобы вы нашли
способ "объяснить" Google, что оба домена следует рассматривать как один сайт.
В своей конфигурации Apache включите mod_rewrite
и перенаправьте ваш трафик, используя постоянную переадресацию (Permanent Redirect HTTP, код ответа 301). По умолчанию mod_rewrite
выполняет перенаправления с кодом 302 (Temporary Redirect, временная переадресация), и Google поэтому индексирует эти домены как различные. Решение:
RewriteCond %{HTTP_HOST} ^yourcompany.net$ [OR] RewriteCond %{HTTP_HOST} ^www.yourcompany.net$ RewriteRule ^.*$ http://www.yourcompany.com/$1 [R=301,L]
3. Предположим, что у вас есть веб-сайт, поддерживающий как обычные, так и защищённые соединения (http и https), и ваш шеф требует, чтобы вы обеспечили по возможности незаметное перенаправление всего http-трафика на https. Что ж, если вы используете Apache с mod_rewrite
, всё, что вам нужно сделать - это записать следующее правило:
RewriteCond %{HTTPS} !=on RewriteRule ^.*$ https://%{SERVER_NAME}/$1 [R,L,NE]
mod_rewrite
для
блокирования любых запросов, идущих с этого сайта, проверяя строку HTTP_REFERER во входящих
запросах. Хотя это не окончательное решение, поскольку, я надеюсь, ваша компания найдёт время
на исправление уязвимости, следующее правило вполне годится на роль "аварийной затычки":
RewriteCond %{HTTP_REFERER} http://www.hackersite.net [NC] RewriteRule - [F][Прим.перев.: хотя на самом деле эта строка служит лишь для самоуспокоения, поскольку что помешает разместить вредоносную ссылку на каком-нибудь ещё сайте?]
Обзор синтаксиса
Директива RewriteCond
позволяет вам проверять определённое условие, необходимое для применения правила. Рассматривайте его как оператор if
в языках программирования. Две или более директив RewriteCond
, записанные последовательно, рассматриваются как объединённые логической операцией "И" (AND), а при использовании выражения [OR]
в конце строки - как объединённые операцией "ИЛИ" (OR). Обратите внимание, что RewriteCond
достаточно гибкая и позволяет вам проверять различные серверные переменные типа заголовков HTTP, параметры соединения, запрос, внутреннюю организацию сервера и даже системную информацию.
Директива RewriteRule
- наиболее важная из тех, которые вы будете использовать. Она, как значится в документации Apache, является "настоящей рабочей лошадкой" модуля mod_rewrite
. Обычно она принимает три параметра: шаблон сопоставления, строку замены и список флагов. Ниже приводится описание флагов, использованных в примерах выше:
R
- указывает на то, что выполняется перенаправление и, если вы явно не указали код 301, будет использован код возврата 302, означающий временное перемещение.L
- завершает цепочку правил; последующие правила не выполняются.NC
- делает шаблон нечувствительным к регистру символов.NE
- запрещает в результирующем URI замещать символы соответствующими кодами (например, %20 вместо пробела).
Заключение
Модуль Apache mod_rewrite
- весьма гибкий инструмент, позволяющий системному администратору быстро решать различные проблемы с веб-сервером. Некоторые "корректировки" могут носить временный характер, пока не будет реализовано соответствующее постоянное решение, и, даже несмотря на то, что иногда mod_rewrite
может являться частью постоянного решения, не злоупотребляйте предоставляемыми им удобствами, поскольку правила mod_rewrite
имеют свойство очень быстро накапливаться, затрудняя сопровождение. Вам когда-нибудь доводилось сопровождать код на языке Perl, использующий регулярные выражения? Если да, то вы, думаю, понимаете, что я хочу сказать.
В заключение, если вы хотите подробнее узнать о том, что находится "под капотом" mod_rewrite
, прочитайте
документацию Apache
и при возникновении сомнений пользуйтесь возможностью mod_rewrite
протоколировать свои действия, что поможет вам в отладке ваших правил.
Внешние ссылки
Об авторе
Андерсон Силва работает в Red Hat, Inc релиз-инженером. Он имеет степень бакалавра в области информатики Университета Либерти, является магистром в области информационных систем Университета Мэна. Он сертифицированный инженер Red Hat и автор ряда статей по Linux, опубликованных в Linux Gazette, Revista do Linux и Red Hat Magazine. Андерсон женат уже 11 лет, имеет 3-х детей. Когда он не занят на работе и не пишет статьи, то с удовольствием тратит время за свою семью, смотрит гонки Формулы-1 и Индикар и водит своих сыновей на картинг.