1. 程式人生 > >關於nginx獲取真實ip,proxy_set_head設置頭部信息的理解

關於nginx獲取真實ip,proxy_set_head設置頭部信息的理解

代理模塊 真是ip 代理模塊 真是ip代理模塊 真是ip代理

$proxy_add_x_forwarded_for $http_x_forwarded_for

這兩個的變量的值的區別,就在於,proxy_add_x_forwarded_for 比http_x_forwarded_for 多了一個$remote_addr的值

但是$remote_addr 只能獲取到與服務器本身直連的上層請求ip,所以設置$remote_addr一般都是設置第一個代理上面

但是問題是,有時候是通過cdn訪問過來的,那麽後面web服務器獲取到的,永遠都是cdn 的ip 而非真是用戶ip

那麽這個時候就要用到X-FORward—for了,這個變量的意思,其實就像是鏈路反追蹤,從客戶的真實ip為起點,穿過多層級的proxy ,最終到達web 服務器,都會記錄下來,所以在獲取用戶真實ip的時候,

一般就可以設置成,proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 這樣就能獲取所有的代理ip 客戶ip

在打印log 的時候,

$http_x_real_ip|$remote_addr

就是 用戶的真是ip

配置如下

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

還有一種情況就是

客戶在經過cdn請求的時候,本來$proxy_add_x_forwarded_for這裏記錄的值都全部都包括,但是,當你需要取值的時候,會發現,即便用排除代理ip模塊

set_real_ip_from 100.0.0.0/8;(這裏是已知的代理ip)
real_ip_header X-Forwarded-For;
real_ip_recursive on;

也會導致

X-Forwarded-For

裏依然有多個ip,這個時候直接取值$http_x_real_ip 就好了,但是前提條件是,cdn 那邊也設置了X-forward,不然,你這邊獲取的你認為是用戶的ip 其實是cdn的ip

關於nginx獲取真實ip,proxy_set_head設置頭部信息的理解