Apache-2.4

Apache 2.4:mod_alias、mod_rewrite、mod_proxy 執行順序

  • May 10, 2019

我找不到任何關於 Apache vhosts 指令優先級/執行順序的文件

是否有任何關於這些將由 Apache 處理的順序的文件?哪個優先於另一個?

一般規則是指令的順序很重要。首先出現並匹配的指令獲勝(就像VirtualHost定義的順序一樣——第一個 VHost 是預設 VHost)。

在大多數情況下,如果您首先定義Aliases/ Redirects 和RewriteRules 以及像 last 這樣的代理規則,ProxyPass如果您希望在應用代理設置之前進行重定向,那麼它應該可以正常工作。

http://httpd.apache.org/docs/2.4/mod/mod_alias.html#order

根據標準合併規則,在不同上下文中發生的別名和重定向與其他指令一樣被處理。但是,當多個別名或重定向出現在同一上下文中(例如,在同一 <VirtualHost> 節中)時,它們將按特定順序進行處理。

首先,所有重定向都在處理別名之前處理,因此與 a 匹配 RedirectRedirectMatch 永遠不會應用別名的請求。其次,別名和重定向按照它們在配置文件中出現的順序進行處理,第一個匹配項優先。

出於這個原因,當這些指令中的兩個或多個應用於同一子路徑時,您必須首先列出最具體的路徑,以使所有指令生效。

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 指令

配置ProxyPassProxyPassMatch規則按照配置順序進行檢查。第一條匹配的規則獲勝。所以通常你應該 ProxyPass首先從最長的 URL 開始對沖突的規則進行排序。否則,更長 URL 的後續規則將被任何使用 URL 前導子字元串的早期規則隱藏。請注意,與工人共享有一些關係。

在位置中訂購 ProxyPass 指令

只能將一個ProxyPass指令放置在 中Location block,並且最具體的位置將優先。

Exclusions 和無代理環境變數

Exclusions 必須位於通用ProxyPass指令之前。在 2.4.26 及更高版本中,“no-proxy”環境變數是排除項的替代方法,並且是在上下文中配置ProxyPass 指令排除項的唯一方法。Location這個變數應該用 設置 SetEnvIf,因為SetEnv沒有足夠早地評估。

引用自:https://serverfault.com/questions/966675