Spec-Zone.ru › Apache HTTP Server

Расширенные приемы с mod_rewrite

Этот документ дополняет mod_rewrite документацию по справке. Он предоставляет несколько расширенных приемов с использованием mod_rewrite.

Обратите внимание, что многие из этих примеров не будут работать без изменений в вашей конкретной конфигурации сервера, поэтому важно понять их, а не просто копировать и вставлять примеры в свою конфигурацию.

Фрагментация URL по нескольким бэкендам

Описание:

Распространенный метод распределения нагрузки сервера или места хранения данных называется «фрагментация». При использовании этого метода фронтенд-сервер будет использовать URL для последовательной «фрагментации» пользователей или объектов на отдельные бэкенд-серверы.

Решение:

Сопоставление пользователей с целевыми серверами хранится во внешних файлах-картах. Они выглядят так:

user1 physical_host_of_user1
user2 physical_host_of_user2
: :

Мы помещаем это в map.users-to-hosts файл. Цель – сопоставить;

/u/user1/anypath

с

http://physical_host_of_user1/u/user/anypath

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

RewriteEngine on
RewriteMap    users-to-hosts      "txt:/path/to/map.users-to-hosts"
RewriteRule   "^/u/([^/]+)/?(.*)" "http://${users-to-hosts:$1|server0}/u/$1/$2"

См. RewriteMap документацию для более подробного обсуждения синтаксиса этой директивы.

Генерация контента в режиме реального времени

Описание:

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

Решение:
Это делается с помощью следующего набора правил:
# This example is valid in per-directory context only
RewriteCond "%{REQUEST_URI}"   "!-U"
RewriteRule "^(.+)\.html$"     "/regenerate_page.cgi"   [PT,L]

Оператор -U определяет, является ли тестовая строка (в данном случае, REQUEST_URI) допустимым URL. Это делается с помощью подзапроса. В случае неудачи этого подзапроса – то есть запрашиваемый ресурс не существует – это правило вызывает программу CGI /regenerate_page.cgi, которая генерирует запрашиваемый ресурс и сохраняет его в каталог документов, так что при следующем запросе можно предоставить статическую копию.

Таким образом, документы, которые редко обновляются, могут быть предоставлены в статической форме. Если документы нужно обновить, их можно удалить из каталога документов, и они будут перегенерированы при следующем запросе.

Распределение нагрузки

Описание:

Мы хотим случайным образом распределить нагрузку по нескольким серверам с помощью mod_rewrite.

Решение:

Мы будем использовать RewriteMap и список серверов для достижения этой цели.

RewriteEngine on
RewriteMap lb        "rnd:/path/to/serverlist.txt"
RewriteRule "^/(.*)" "http://${lb:servers}/$1"     [P,L]

serverlist.txt будет содержать список серверов:

## serverlist.txt

servers one.example.com|two.example.com|three.example.com

Если вы хотите, чтобы один конкретный сервер получал больше нагрузки, чем другие, добавьте его в список большее количество раз.

Обсуждение

Apache поставляется с модулем балансировки нагрузки – mod_proxy_balancer – который намного более гибкий и функциональный, чем все, что можно собрать с помощью mod_rewrite.

Структурированные каталоги домашних пользователей

Описание:

Некоторые сайты с тысячами пользователей используют структурированную схему каталогов домашних пользователей, т.е. каждый каталог домашней страницы находится в подкаталоге, начинающемся (например) с первой буквы имени пользователя. Итак, /~larry/anypath находится в /home/l/larry/public_html/anypath, а /~waldo/anypath – в /home/w/waldo/public_html/anypath.

Решение:

Мы используем следующий набор правил для расширения URL с тильдой в указанной схеме.

RewriteEngine on
RewriteRule   "^/~(([a-z])[a-z0-9]+)(.*)"  "/home/$2/$1/public_html$3"

Перенаправление по якорям

Описание:

По умолчанию перенаправление на HTML-якорь не работает, потому что mod_rewrite экранирует символ #, превращая его в %23. Это, в свою очередь, нарушает перенаправление.

Решение:

Используйте флаг [NE] для RewriteRule. NE означает «Без экранирования».

Обсуждение:
Этот метод, конечно же, также будет работать с другими специальными символами, которые mod_rewrite по умолчанию кодирует в URL.

Перенаправление, зависящее от времени

Описание:

Мы хотим использовать mod_rewrite для предоставления разного контента в зависимости от времени суток.

Решение:

Существует много переменных с именем TIME_xxx для условий перенаправления. В сочетании со специальными лексикографическими шаблонами сравнения <STRING, >STRING и =STRING мы можем выполнить перенаправления, зависящие от времени:

RewriteEngine on
RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" ">0700"
RewriteCond   "%{TIME_HOUR}%{TIME_MIN}" "<1900"
RewriteRule   "^foo\.html$"             "foo.day.html" [L]
RewriteRule   "^foo\.html$"             "foo.night.html"

Это обеспечивает контент foo.day.html по URL foo.html с 07:01-18:59 и в оставшееся время контент foo.night.html.

mod_cache, промежуточные прокси-серверы и браузеры могут кэшировать ответы и привести к отображению любой из страниц вне заданного временного интервала. mod_expires может использоваться для управления этим эффектом. Естественно, вам гораздо лучше просто динамически предоставлять контент и настраивать его в зависимости от времени суток.

Установка переменных окружения на основе частей URL

Описание:

Иногда мы хотим сохранить какой-либо статус при выполнении перенаправления. Например, вы хотите отметить, что выполнили это перенаправление, чтобы позже проверить, пришел ли запрос через это перенаправление. Один из способов сделать это – установить переменную окружения.

Решение:

Используйте флаг [E] для установки переменной окружения.

RewriteEngine on
RewriteRule   "^/horse/(.*)"   "/pony/$1" [E=rewritten:1]

Позже в вашем наборе правил вы можете проверить эту переменную окружения с помощью RewriteCond:

RewriteCond "%{ENV:rewritten}" "=1"

Обратите внимание, что переменные окружения не сохраняются при внешнем перенаправлении. Вы можете рассмотреть использование флага [CO] для установки cookie. Для перенаправлений по каталогам и в файле .htaccess, где окончательная замена обрабатывается как внутреннее перенаправление, переменные окружения из предыдущего раунда перенаправления имеют префикс "REDIRECT_".

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/rewrite/advanced.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API