我找不到任何关于 Apache vhosts 指令优先级/执行顺序的文档
mod_alias
(Redirect
指示),mod_rewrite
(RewriteRule
指示)mod_proxy
(ProxyPass
指示)。
有没有关于 Apache 处理这些操作的顺序的文档?哪一个优先于另一个?
答案1
一般规则是指令的顺序很重要。最先匹配的指令胜利(就像定义的顺序一样VirtualHost
- 第一个 VHost 是默认 VHost)。
在大多数情况下,如果您希望在应用代理设置之前进行重定向,则如果您首先定义Alias
es/ Redirect
s 和RewriteRule
s 并且最后定义代理规则(如最后一个) ,它应该可以正常工作。ProxyPass
http://httpd.apache.org/docs/2.4/mod/mod_alias.html#order
在不同上下文中发生的别名和重定向将像其他指令一样按照标准进行处理合并规则。但当多个别名或重定向出现在同一个上下文中时(例如,在同一个
<VirtualHost>
部分)中,它们会按照特定顺序进行处理。首先,所有重定向都会在处理别名之前进行处理,因此与
Redirect
或者RedirectMatch
永远不会应用别名。其次,别名和重定向按照它们在配置文件中出现的顺序进行处理,第一个匹配的优先。因此,当两个或多个这样的指令应用于同一个子路径时,必须首先列出最具体的路径,以便所有指令都能生效。
https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule
指令
RewriteRule
是真正的重写主力。指令可以出现多次,每个实例定义一条重写规则。定义这些规则的顺序很重要 - 这是它们在运行时应用的顺序。
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
订购 ProxyPass 指令
配置的ProxyPass
和ProxyPassMatch
规则按照配置顺序进行检查。第一个匹配的规则获胜。因此,通常你应该对冲突的规则进行排序ProxyPass
首先从最长的 URL 开始的规则。否则,较长 URL 的后续规则将被任何使用 URL 前导子字符串的早期规则隐藏。请注意,这与工作人员共享有某种关系。在位置中对 ProxyPass 指令进行排序
只有一个ProxyPass
指令可以放在Location block
,最具体的位置将优先。排除和无代理环境变量
排除必须位于一般ProxyPass
指令之前。在 2.4.26 及更高版本中,“no-proxy”环境变量是排除的替代方法,并且是配置排除指令的唯一ProxyPass
方法Location
上下文。此变量应使用SetEnvIf
, 作为SetEnv
没有及早进行评估。