Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Серверные службы Linux

Реальные примеры использования 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]
4. Представьте себе ситуацию, когда, по той или иной причине, вы хотите заблокировать ссылки, ведущие на ваш сайт с какого-то другого сайта. Возможно, какой-то хакер нашёл способ взлома вашего приложения и разместил на своём сайте ссылку, позволяющую кому угодно скачивать некоторые защищённые авторским правом материалы. Вы могли бы использовать 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 и Индикар и водит своих сыновей на картинг.