服務端如何獲取客戶端請求IP地址,網上代碼一搜一大把。其中比較常見有x-forwarded-for、client-ip等請求頭,及remote_addr參數,那么為什么會存在這么多獲取方式,以及到底怎樣獲取才是安全的呢?
remote_addr指的是當前直接請求的客戶端IP地址,它存在於tcp請求體中,是http協議傳輸時自動添加的,不受請求頭header所控制。所以,當客戶端與服務器間不存在任何代理時,通過remote_addr獲取客戶端IP地址是最准確的,也是最安全的。
x-forwarded-for簡稱XFF,它其實和http協議本身並沒什么關系,是很多代理服務器在請求轉發時添加上去的。如果客戶端和服務器之間存在代理服務器,那么直接通過remote_addr獲取的IP就是代理服務器的地址,並不是客戶端真實的IP地址。因此,需要代理服務器(通常是反向代理服務器)將真實客戶端的IP地址轉發給服務器,轉發時客戶端的真實IP地址通常就存在於x-forwarded-for請求頭中。
client-ip同x-forwarded-for,也是代理服務器添加的用於轉發客戶端請求的真實IP地址,同樣保存於請求頭中。
通過什么參數來獲取客戶端請求地址是由實際的應用場景決定的:
當客戶端與服務器之間不存在代理服務器(尤其指服務端反向代理服務器)時,直接通過remote_addr獲取客戶端請求IP地址。
當服務器間存在反向代理服務器時,需要在反向代理服務器中轉發客戶端真實請求IP地址,可以設置x-forwarded-for、client-ip,也可以自定義請求頭名稱,然后在服務端代碼中獲取請求頭中的該值。需要注意的是,此時必須保證服務器不會繞過代理服務器直接對外提供服務,否則存在IP偽造的風險(客戶端偽造設置請求頭)。
nginx設置方式:
proxy_set_header x-rewarded-for $remote_addr;
