proxy_set_header
?是 Nginx 配置中的一個重要指令,特別是在使用 Nginx 作為反向代理時。該指令允許你修改由 Nginx 傳遞給代理后端的請求頭。這對于確保后端應用程序能夠接收到正確的客戶端信息(如 IP 地址、主機名等)以及控制緩存行為等場景非常有用。
以下是?proxy_set_header
?指令的一些常見用法和詳解:
-
設置 Host 頭:
當 Nginx 代理請求到后端服務器時,默認情況下會保留原始的 Host 頭。但是,在某些情況下,你可能需要覆蓋這個值。proxy_set_header Host $host;
這里?
$host
?是 Nginx 變量,它包含了請求的主機名。 -
傳遞真實客戶端 IP:
當 Nginx 位于負載均衡器或 CDN 后面時,后端服務器看到的客戶端 IP 可能是負載均衡器或 CDN 節點的 IP,而不是真實用戶的 IP。為了解決這個問題,你可以使用?X-Real-IP
?或?X-Forwarded-For
?頭來傳遞真實 IP。proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
$remote_addr
?是客戶端的 IP 地址。$proxy_add_x_forwarded_for
?是一個特殊的 Nginx 變量,它包含了原始請求的?X-Forwarded-For
?頭的內容,并附加上客戶端的 IP 地址。 -
控制緩存:
你可以通過修改或添加特定的頭來控制后端服務器或中間緩存的行為。proxy_set_header Cache-Control "no-cache, no-store, must-revalidate"; proxy_set_header Pragma no-cache; proxy_set_header Expires 0;
這些頭通常用于確保請求不會被緩存,或者用于控制緩存的持續時間。
-
自定義頭:
除了修改標準 HTTP 頭之外,你還可以添加自定義頭來傳遞額外的信息給后端服務器。proxy_set_header My-Custom-Header "SomeValue";
-
刪除頭:
雖然?proxy_set_header
?主要用于添加或修改頭信息,但你也可以通過將其設置為空值來刪除不需要的頭。proxy_set_header Accept-Encoding "";
這將刪除?
Accept-Encoding
?頭,可能是因為你不希望后端服務器對內容進行壓縮。 -
條件性地設置頭:
結合 Nginx 的?map
?模塊,你可以根據條件來設置頭信息。例如,你可以創建一個映射來根據?$http_user_agent
?變量的值設置不同的頭。 -
注意安全性:
當使用?proxy_set_header
?時,要注意不要泄露敏感信息或允許未授權訪問。確保你了解每個設置的安全影響,并遵循最佳實踐來保護你的應用程序和數據。
在配置?proxy_set_header
?時,請確保你的設置與后端服務器的期望相匹配,并進行充分的測試以確保一切按預期工作。