Nginx

Nginx - 可以在伺服器塊級別安全地使用“if”嗎?

  • December 9, 2021

Nginx 文件毫不含糊地警告說,如果是邪惡的,應該盡可能避免,並且在網際網路的長度和廣度上都有類似的警告。

但是,這些警告中的大多數都特別關注塊中的不良if行為。location此外,Nginx 文件說:

如果在位置上下文中,唯一可以在內部完成的 100% 安全的事情是:

  • 返回 …;
  • 重寫…最後;

我的問題是:如果其中包含的唯一指令是 aif在塊級別server(而不是塊)使用 a 是否安全?例如,以下 www-to-non-www 重定向:location``return

server {
   listen 80;
   server_name example.com www.example.com;

   if ($http_host != example.com) {
       return 301 http://example.com$request_uri;
   }

   # more config
}

第二個問題:我知道做這種事情的推薦方法是使用兩個server具有不同值的塊server_name。如果這可以接受的用途if,還有什麼理由仍然使用兩個單獨的server塊?

nginx 收到請求的第一步是評估 HTTPHost標頭/TLS SNI 欄位,並根據評估結果選擇虛擬主機。

這意味著Host始終處理標頭。

現在,如果你指定一個if重定向語句,這意味著Host將檢查兩次標頭,首先選擇虛擬主機,然後檢查if條件。這是處理器工作量的兩倍。

一個相反的論點可能是一個單獨的伺服器塊的記憶體消耗。但是,在 nginx 程序的生命週期內,記憶體分配是相同的,而對 header 的雙重評估Host發生在每個請求上。

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