Reverse-Proxy

當發生衝突時,Caddy 會選擇哪個匹配器?

  • November 6, 2020

Caddyfile 中的指令可以具有將它們限制為特定請求的“匹配器”。這讓 Caddy 2 為不同的路徑提供不同的內容,但是當多個指令匹配同一個請求時會發生什麼?

如果我想使用 Caddy 2 為一個主要是靜態的網站提供服務,但將一個/api/區域轉發給某個 Node.js 程序,我的 Caddyfile 可能如下所示:

fake-example.edge.app {
 root * /var/www/example
 reverse_proxy /api/* localhost:9000
 file_server *
}

請求/api/user將同時匹配 thefile_server *reverse_proxy /api/*匹配器,因此不清楚該請求將轉到文件系統還是 Node.js 程序。

我在 Caddy 2 文件中找不到任何描述應該發生什麼的內容。在我自己的測試中,結果似乎取決於指令在文件中出現的順序,較早的條目“獲勝”。應該發生什麼?如果它是“未定義的行為”,是否有更好的方法來編寫此文件以避免歧義?

在我的理解和經驗reverse_proxy中優先,因為指令具有預設的隱式順序:https ://caddyserver.com/docs/caddyfile/directives#directive-order 。

要強制執行不同的訂單,您至少有 3 個選項:

  1. 使用路線:
   route /api/* {
     file_server
     reverse_proxy localhost:9000
   }
  1. order使用全域選項更改預設順序
  2. handlefile_server之前一起使用reverse_proxy

根據我的理解和經驗,更具體的考慮比更通用的。

例如,在您的情況下,任何匹配 /API/ 的東西都應該轉發到節點,而其他任何東西都應該轉發到普通的網路伺服器。

無論如何,只要 /api/ 不是網站上的實際文件夾,訪問網站的請求就無關緊要

另請參閱:https ://caddyserver.com/docs/caddyfile/directives/root

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