MyTetra Share
Делитесь знаниями!
Apache 2: Как настраивать перенаправление URL в .htaccess - Директивы RewriteRule и RewriteCond
Время создания: 28.09.2014 07:32
Автор: xintrea
Текстовые метки: apache, апач, .htaccess, mod_rewrite, RewriteRule, RewriteCond, REQUEST_URI, настройка, примеры
Раздел: Компьютер - Linux - Сеть в Linux - Apache
Запись: xintrea/mytetra_syncro/master/base/14118751377d71edisy4/text.html на raw.github.com

Это заготовка статьи. Дописать.

До настоящего времени в Рунете я так и не смог найти статьи, в которой бы доступно и полно рассказывалось о том, как настраивать директивы RewriteCond и RewriteRule в файле .htaccess.

Нигде нет ответа на самые основные вопросы: как происходит преобразование URL, переданного браузером? Как увидеть новый преобразованный URL? А можно ли посмотреть лог преобразований URL?

Нам дают какой-то черный ящик, в котором нужно писать какие-то странные заклинания, не видя, что происходит в процессе и на выходе. Нас это не устраивает. Поэтому будем разбираться.

Суровое примечание: существует разница между понятиями URL и URI. Эти два термина являются стандартами представления адресов. URI (Uniform Resource Identifier, RFC 2396, т. е. универсальный идентификатор ресурса) — это общий термин для всех допустимых форматов схем адресации, поддерживаемых в сети Интернет. URL (Uniform Resource Locators, RFC 1738 / RFC 1808) — это формат схемы адресации с использованием универсальных локаторов ресурсов, которые явно указывают местонахождение ресурса. Грубо говоря, URL - это подмножество URI. В настоящее время повсеместно используется только стандарт URL. Но профессионалы, впавшие в интеллектуальный снобизм, используют термин URI как "более точный и правильный". Я не отношусь к таким профессионалам, поэтому далее свободно использую термин URL, просто потому что мне так привычней.

Далее предполагается, что модуль mod_rewrite подключен к Апачу и работает, а нам осталось только правильно прописать директивы перенаправления URL в файле .htaccess.

Как работает перенаправление URL в .htaccess через модуль mod_rewrite?

Когда говорят о перенаправлении адреса через mod_rewrite, проще всего представить файл .htaccess в виде программы, которая выполняется по строкам сверху вниз. На вход этой программы подается исходный URL, на выходе получаем измененный URL.

Строками нашей условной программы являются директивы модуля mod_rewrite:

  • RewriteEngine - включение/выключение перенаправления. Обычно используется в начале файла .htaccess в виде:

    RewriteEngine On
  • RewriteBase - определение корневой директории для преобразования строки URL в имя файла. Обычно используется в начале файла .htaccess в виде:

    RewriteBase /
  • RewriteOptions - установка некоторых специальных опций для текущей конфигурации в контексте сервера или каталога. Здесь рассматривать не будем.
  • RewriteCond - это пред-условие для директивы RewriteRule. Одно RewriteRule может иметь несколько RewriteCond. Имеет формат:

    RewriteCond что_сравниваем с_чем_сравниваем

    RewriteRule
    выполнится только в том случае, если все предыдущие директивы RewriteCond находилсь в значении True.
  • RewriteRule - команда преобразования URL. Имеет формат:

    RewriteRule исходная_строка(т.е. шаблон) преобразованная_строка(т.е. подстановка) [Флаги]

Здесь мы будем рассматривать только самое простое и самое популярное преобразование: преобразование строки URL в имя файла на ресурсе, где крутится Apache.

В каком виде попадает URL вовнутрь .htaccess?

В файл .htaccess строка URL попадает без обозначения протокола и имени домена.

Например, если в строке браузера написано "http://mysite.ru/messages/index.php", то URL, который попадет вовнутрь файла .htaccess, будет "messages/index.php".

Как увидеть преобразования URL?

Пока мы не будем видеть преобразований, которые претерпевает URL при срабатывании директив mod_rewrite, мы не сможем понять его работу и не сможем правильно написать файл .htaccess.

Увидеть лог преобразований mod_rewrite можно в логе Апача. Но для начала нужно настроить Апач так, чтобы информация о преобразовании URL попадала в лог. Настройки для Апача версий ниже 2.4 и Apache 2.4 и выше отличаются.

Для Апача до версии 2.4:

В настроечном файле Апача httpd.conf надо проверить наличие директив RewriteLog и RewriteLogLevel, (при отсутсвии их нужно добавить), и установить следующие значения этим директивам:

# Для Apache версий ниже 2.4

RewriteLog "/var/log/apache2/rewrite.log"

RewriteLogLevel 3

Путь к файлу лога должен существовать в файловой системе. В этом файле будет складываться информация о преобразовании URL.

Для Апача 2.4 и выше:

В настроечном файле Апача httpd.conf надо найти директиву LogLevel и установить ей значение:

# Для Apache 2.4 и выше

LogLevel alert rewrite:trace3

Информация о преобразовании URL будет складываться в логе Апача (проверить, возможно, что не так, у меня нет Apache 2,4).

После чего необходимо перезапустить Апач. В логах будут видны примерно следующие записи:

rewrite 'admin/vipPortPageId/forward_function' -> 'index.php/admin/vipPortPageId/forward_function'

RewriteCond: input='/small/asdfsadf/avatar.jpg' pattern='^(.*)/(.*)/(.*)' => matched

RewriteCond: input='/var/www/local.dev/www/small/avatar.jpg' pattern='-f' => matched

rewrite 'small/asdfsadf/avatar.jpg' -> '/small/avatar.jpg'

internal redirect with /small/avatar.jpg [INTERNAL REDIRECT]

Внимание! Логирование результатов преобразований в mod_rewrite - очень времязатратный процесс. Не допускайте таких настроек на сервере в продершене. Даже на тестовом сервере настройте логирование, отладьте перенаправление, а затем верните настройки назад.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования