我使用 Nginx 作為反向代理。
這些標頭之間有什么區別:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
在某些檔案/教程中,我看到兩者都被使用,而在其他檔案/教程中,只有第一個。
它們看起來很相似,所以我想了解它們的不同之處以及我是否需要同時使用它們。
uj5u.com熱心網友回復:
這些標題之間有什么區別?
您是否檢查了$proxy_add_x_forwarded_for變數檔案?
附加變數的
X-Forwarded-For客戶端請求標頭欄位,$remote_addr以逗號分隔。如果X-Forwarded-For客戶端請求標頭中不存在該欄位,則該$proxy_add_x_forwarded_for變數等于該$remote_addr變數。
如果傳入的請求已經包含X-Forwarded-For標頭,讓我們說
X-Forwarded-For: 203.0.113.195, 150.172.238.178
并且您的請求來自 IP 198.51.100.17,新的X-Forwarded-For標頭值(要傳遞給上游)將是
X-Forwarded-For: 203.0.113.195, 150.172.238.178, 198.51.100.17
如果傳入的請求不包含X-Forwarded-For標頭,則此標頭將作為
X-Forwarded-For: 198.51.100.17
另一方面,以X-Real-IP您在問題中顯示的方式設定的標題將始終等于$remote_addrnginx 內部變數,在這種情況下它將是
X-Real-IP: 198.51.100.17
(除非ngx_http_realip_module將參與將該變數值更改為實際遠程對等地址以外的其他值;閱讀模塊檔案以了解所有詳細資訊;此SO 問題也有一些有用的示例/其他詳細資訊。)
我是否需要同時使用兩者?
您的第一個問題應該是“我是否需要將任何這些標頭添加到發送到我的后端的請求中?” 這實際上取決于您的后端應用程式。它是否依賴于這些標題中的任何一個?這些標頭值實際上對應用程式行為有什么影響嗎?您的后端應用程式將如何處理這些標頭值?如您所見,請求來源假定為X-Forwarded-For地址串列中的第一個地址。另一方面,該標頭很容易被欺騙,因此某些服務器設定可能只允許將該標頭用于受信任的來源,否則將其洗掉。如果您X-Real-IP通過服務器設定設定標頭,它將始終包含實際的遠程對等地址;如果你不這樣做,并且你收到了一個欺騙性的請求X-Real-IP標頭已經存在于其中,它將按原樣傳遞給您的后端,如果您的應用程式更愿意依賴該標頭而不是X-Forwarded-For一個標頭,這可能會非常糟糕。不同的后端應用程式可能表現不同;你可以查看這個GitHub 問題討論來了解這個想法。
總結這一切。
如果您確定您的后端應用程式可以實際處理哪些標頭以及如何完成,您應該根據處理它們的方式設定所需的標頭并跳過非必需的標頭以最小化代理的有效負載。如果您不這樣做,并且您不知道您的應用程式是否會被錯誤的X-Forwarded-For標頭欺騙,并且您的 nginx 實體前面沒有受信任的代理服務器,那么最安全的方法是根據實際的遠程對等地址設定兩者:
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
如果您確定您的后端應用程式不會被錯誤的X-Forwarded-ForHTTP 標頭欺騙,并且您想向其提供您在原始請求中獲得的所有資訊,請使用您在問題中顯示的示例:
proxy_set_header X-Forwarded-For $proxy_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
一些額外的技術資訊。
實際上,這些X-Forwarded-...HTTP 標頭是某種非標準標頭。根據 MDN,假設用于傳輸此類資訊的標準標頭將Via在RFC7230中描述,并且在RFC7239Forwarded中描述。然而,和成為替代的和事實上的標準版本,而不是那些。而不是 using ,它可能會或可能不會被您的后端應用程式解釋,更可靠的方法是使用以下任一方法顯式設定代理請求的 HTTP 標頭X-Forwarded-ForX-Forwarded-HostX-Forwarded-ProtoX-Forwarded-HostHost
proxy_set_header Host $host;
或者
proxy_set_header Host $http_host;
甚至
proxy_set_header Host $server_name;
(你可以在這里$host檢查,$http_host和$server_namenginx 內部變數之間的區別。)另一方面,它經常用于告訴后端應用程式是否原始請求是通過加密的 HTTPS 協議發出的。有時您甚至可以看到配置中使用的標頭;至于我,這看起來毫無意義,因為后端應用程式的行為不應因您實際使用的反向代理軟體而異;但是我可以相信有一些網路應用程式可以真正以某種有用的方式處理該應用程式。MDN 根本沒有提到標頭;然而,這絕對是相當多的網路應用程式應該提供的。X-Forwarded-ProtoX-Forwarded-ProxyX-Real-IP
還有一個技術細節。像其他一些反向代理服務器一樣,nginx 會將多個X-Forwarded-For標頭“折疊”成一個標頭,因此
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
和
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
配置片段的行為相同,將單個X-Forwarded-For標頭傳遞給您的后端應用程式,無論使用什么配置都是相同的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/489977.html
標籤:http nginx http头 反向代理 nginx-反向代理
上一篇:如何模擬.NETHTTP回應?
下一篇:自動重定向后cookie被洗掉
