Вопрос или проблема
Я не могу найти никакой документации о приоритете инструкций vhosts Apache / порядке выполнения между
mod_alias
(Redirect
инструкции),mod_rewrite
(RewriteRule
инструкции)mod_proxy
(ProxyPass
инструкции).
Существует ли какая-либо документация о порядке, в котором Apache будет обрабатывать эти инструкции? Какая из них имеет преимущество над другой?
Общее правило таково: порядок директив важен. Директива, которая идет первой и соответствует выигрывает (так же, как и порядок определений VirtualHost
– первый VHost является стандартным VHost).
В большинстве случаев это должно работать нормально, если вы сначала определите Alias
ы/Redirect
ы и RewriteRule
ы, а правила прокси, такие как ProxyPass
, ставите последними, если хотите, чтобы перенаправление происходило до применения ваших настроек прокси.
http://httpd.apache.org/docs/2.4/mod/mod_alias.html#order
Alias и Redirect, возникающие в разных контекстах, обрабатываются
как и другие директивы в соответствии со стандартными правилами объединения. Но
когда несколько Alias или Redirect появляются в одном контексте (например, в одной
<VirtualHost>
секции), они обрабатываются в определенном порядке.Сначала обрабатываются все Redirect до того, как будут обработаны Alias, и
следовательно, запрос, который соответствует
Redirect
или
RedirectMatch
никогда не будет иметь примененных Alias. Во-вторых, Alias и Redirect обрабатываются
в порядке их появления в конфигурационных файлах, при этом
первое соответствие имеет преимущество.По этой причине, когда две или более этих директив применимы к
одному и тому же подпути, вы должны перечислить наиболее специфический путь первым, чтобы
все директивы подействовали.
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
Директива
RewriteRule
является настоящей рабочей лошадкой переписывания. Директива может появляться более одного раза, при этом каждый экземпляр определяет
одно правило переписывания. Порядок, в котором эти правила определяются, важен – это порядок, в котором они будут применяться во время выполнения.
Смотрите также: Технические детали Apache mod_rewrite
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
Упорядочение директив ProxyPass
НастроенныеProxyPass
иProxyPassMatch
правила проверяются в порядке конфигурации. Первое правило, которое соответствует, выигрывает. Поэтому обычно вы должны сортировать конфликтующие
ProxyPass
правила, начиная с самых длинных URL. В противном случае более поздние
правила для более длинных URL будут скрыты более ранним правилом, которое использует
начальную подстроку URL. Обратите внимание, что есть некоторая связь с
совместным использованием рабочих процессов.Упорядочение директив ProxyPass в Locations
В однойProxyPass
директиве можно разместить только однуLocation block
, и наиболее специфическое
местоположение будет иметь преимущество.Исключения и переменная окружения no-proxy
Исключения должны идти перед общимиProxyPass
директивами. В версиях 2.4.26 и более поздних
переменная окружения “no-proxy” является альтернативой исключениям,
и это единственный способ настроить исключение для директивыProxyPass
в контекстеLocation
. Эта переменная должна быть установлена с помощью
SetEnvIf
, так какSetEnv
не оценивается достаточно рано.
Поскольку я не смог найти ответ в документации, вот ответ (странный!) после тестирования на Apache2 2.4.62:
RewriteRule-R > AuthType(SSO) > Location-Redirect > RewriteRule-P > Location-ProxyPass > ProxyPass > Redirect
Примечание: если правило RewriteRule-P соответствует раньше, чем правило RewriteRule-R, правило RewriteRule-R игнорируется, поэтому сначала выполняется Location-Redirect.
Проверено с следующим внутри < VirtualHost > :
# приоритет #0 (если не совпадает с RewriteRule-P ранее)
RewriteRule /a/b/c/d/e/f.* https://RewriteRule-R [R,END,L]
<Location /a/b/c/d/e >
# приоритет #1
AuthType CAS
require valid-user
</Location>
<Location /a/b/c/d >
# приоритет #2
Redirect https://Location-Redirect
</Location>
# приоритет #3 (приоритет одинаков внутри или вне <Location> )
RewriteRule /a/b/c.* http://localhost/RewriteRule-P [P]
<Location /a/bb >
# приоритет #4
ProxyPass http://localhost/Location-ProxyPass
</Location>
# приоритет #5
ProxyPass /a http://localhost/Top-ProxyPass
# приоритет #6
Redirect / https://Top-Redirect
Ответ или решение
Порядок выполнения директив Apache 2.4: mod_alias, mod_rewrite, mod_proxy
Apache HTTP Server является мощным инструментом, который предоставляет веб-разработчикам множество возможностей для управления маршрутизацией запросов. Вопрос порядка выполнения директив модулей mod_alias
, mod_rewrite
и mod_proxy
становится важным аспектом при настройке виртуальных хостов (vhosts). Данная статья рассматривает порядок обработки этих модулей, основные правила, а также примеры практического применения.
Основные правила приоритетов
Apache обрабатывает директивы в указанном порядке, и директива, соответствующая запросу, которая встречается первой, будет иметь приоритет. Это общее правило, действующее во всех случаях, включая определения виртуальных хостов. Так, в случае конфликта между несколькими директивами, первое более специфичное правило перекроет менее специфичное.
Порядок обработки модулей
-
mod_alias:
- Директивы
Redirect
иRedirectMatch
обрабатываются первыми. Это означает, что если запрос соответствует одному из этих правил, то последующие комбинации с использованиемmod_rewrite
илиmod_proxy
не будут применены. - Важно также, что порядок
Redirect
передAlias
соблюдается, чтобы избежать неожиданных результатов.
- Директивы
-
mod_rewrite:
- После обработки директив
mod_alias
, обрабатываются правилаRewriteRule
. ДирективыRewriteRule
могут содержать более сложные условия и грамматику, обеспечивая большую гибкость в маршрутизации URL. - Как и в случае с другими модулями, порядок директив
RewriteRule
имеет значение — они обрабатываются по порядку их определения.
- После обработки директив
-
mod_proxy:
- Последними обрабатываются директивы
ProxyPass
иProxyPassMatch
. Это означает, что если существует пересечение с правиламиRedirect
илиRewriteRule
, то в первую очередь будут применяться они, а уже потом — прокси-настройки. - Это позволяет гибко управлять маршрутизацией запросов и интеграцией с другими сервисами.
- Последними обрабатываются директивы
Пример конфигурации
Рассмотрим практический пример конфигурации, чтобы проиллюстрировать вышеописанный порядок:
<VirtualHost *:80>
# Приоритет #0
RewriteRule ^/a/b/c/d/e/f.* https://example.com/RewriteRule-R [R,END,L]
<Location /a/b/c/d/e>
# Приоритет #1
AuthType CAS
require valid-user
</Location>
<Location /a/b/c/d>
# Приоритет #2
Redirect https://example.com/Location-Redirect
</Location>
# Приоритет #3
RewriteRule ^/a/b/c.* http://localhost/RewriteRule-P [P]
<Location /a/bb>
# Приоритет #4
ProxyPass http://localhost/Location-ProxyPass
</Location>
# Приоритет #5
ProxyPass /a http://localhost/Top-ProxyPass
# Приоритет #6
Redirect / https://Top-Redirect
</VirtualHost>
В этом примере видно, как каждый из компонентов срабатывает в зависимости от места и порядка определения. Например, если /a/b/c/d/e/f
соответствует правилу RewriteRule
, то эти запросы будут перенаправлены на указанный адрес, не проходя проверки прокси.
Заключение
Понимание порядка выполнения директив модулей mod_alias
, mod_rewrite
и mod_proxy
в Apache 2.4 является важным аспектом для успешной настройки веб-сервера. Четкое следование правилам обработки директив позволяет избежать проблем с маршрутизацией запросов и обеспечивает корректное взаимодействие между различными функциональностями.
Эти принципы являются важными для разработчиков и системных администраторов, стремящихся к оптимизации работы своих веб-служб и улучшению пользовательского опыта.