|
|||||||
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:
Здесь мы будем рассматривать только самое простое и самое популярное преобразование: преобразование строки 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 - очень времязатратный процесс. Не допускайте таких настроек на сервере в продершене. Даже на тестовом сервере настройте логирование, отладьте перенаправление, а затем верните настройки назад. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|