Расширенные приемы с 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по URLfoo.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