Nginx
Nginx - 可以在伺服器塊級別安全地使用“if”嗎?
Nginx 文件毫不含糊地警告說,如果是邪惡的,應該盡可能避免,並且在網際網路的長度和廣度上都有類似的警告。
但是,這些警告中的大多數都特別關注塊中的不良
if
行為。location
此外,Nginx 文件說:如果在位置上下文中,唯一可以在內部完成的 100% 安全的事情是:
- 返回 …;
- 重寫…最後;
我的問題是:如果其中包含的唯一指令是 a
if
在塊級別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 收到請求的第一步是評估 HTTP
Host
標頭/TLS SNI 欄位,並根據評估結果選擇虛擬主機。這意味著
Host
始終處理標頭。現在,如果你指定一個
if
重定向語句,這意味著Host
將檢查兩次標頭,首先選擇虛擬主機,然後檢查if
條件。這是處理器工作量的兩倍。一個相反的論點可能是一個單獨的伺服器塊的記憶體消耗。但是,在 nginx 程序的生命週期內,記憶體分配是相同的,而對 header 的雙重評估
Host
發生在每個請求上。