1、x-forwarded-for
針對這個,去了解了下,總結下其他人的經驗:
當你使用了代理時,web服務器就不知道你的真實IP了,為了避免這個情況,代理服務器通常會增加一個叫做x_forwarded_for的頭信息,把連接它的客戶端IP(即你的上網機器IP)加到這個頭信息里,這樣就能保證網站的web服務器能獲取到真實IP,
X-Forwarded-For 是一個擴展頭。HTTP/1.1(RFC 2616)協議並沒有對它的定義,它最開始是由 Squid 這個緩存代理軟件引入,用來表示 HTTP 請求端真實 IP,現在已經成為事實上的標准,被各大 HTTP 代理、負載均衡等轉發服務廣泛使用,並被寫入 RFC 7239 (Forwarded HTTP Extension)標准之中。
X-Forwarded-For 請求頭格式非常簡單,就這樣:
X-Forwarded-For: client, proxy1, proxy2
可以看到,XFF 的內容由「英文逗號 + 空格」隔開的多個部分組成,最開始的是離服務端最遠的設備 IP,然后是每一級代理設備的 IP。
如果一個 HTTP 請求到達服務器之前,經過了三個代理 Proxy1、Proxy2、Proxy3,IP 分別為 IP1、IP2、IP3,用戶真實 IP 為 IP0,那么按照 XFF 標准,服務端最終會收到以下信息:
X-Forwarded-For: IP0, IP1, IP2
總結是:在使用nginx等反向代理服務器的時候,是必須使用X-Forward-For來獲取用戶IP地址的(此時Remote Address是nginx的地址),因為此時X-Forward-For中的地址是由nginx寫入的,而nginx是可信任的。不過此時要注意,要禁止web對外提供服務。
2、Remote Address
Remote Address代表的是當前HTTP請求的遠程地址,即HTTP請求的源地址。HTTP協議在三次握手時使用的就是這個Remote Address地址,在發送響應報文時也是使用這個Remote Address地址。因此,如果請求者偽造Remote Address地址,他將無法收到HTTP的響應報文,
此時偽造沒有任何意義。這也就使得Remote Address默認具有防篡改的功能。如果Http請求經過代理服務器轉發,則這種情況,用戶的真實ip會丟失,所以才有了
X-Forwarded-For
的方式。