使用nginx轉發請求時,應用中獲取到的用戶ip 都是127.0.0.1,獲取真實ip必須重寫一些頭部才行。通常在WSGI環境中經常使用的變量:REMOTE_ADDR ,在nginx轉發時設置頭部攜帶這個變量
nginx設置
server {
listen 80;
server_name _;
location / {
..................
proxy_pass http://127.0.0.1:8000/;
# $host 變量,Host 為變量名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在nginx中添加配置:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
解釋:
X-Real-IP $remote_addr :
將用戶的真實IP存放到X-Real-IP這個變量中(變量名可以自定義)
獲取:
request.getHeader("X-Real-IP")
X-Forwarded-For $proxy_add_x_forwarded_for:
添加用戶的真實IP存放到X-Forwarded-For變量中(變量名可以自定義),如果搭建了兩台nginx在不同的ip上,將會獲取到用戶的真實IP和第一台nginx的ip,以“,”隔開。
$proxy_add_x_forwarded_for中包含了客戶端請求頭中的"X-Forwarded-For"和$remote_addr兩個部分。
如果搭建了兩台nginx在不同的ip上:
經過第一個nginx的時候,此時"X-Forwarded-For"為null,"X-Forwarded-For"默認為null,只有$remote_addr,$remote_addr中就是用戶的真實ip,所以此時的"X-Forwarded-For"中的值就是用戶的真實ip,
經過第二個nginx的時候,此時"X-Forwarded-For"中包含了用戶的真實ip,$remote_addr值為上一個nginx的ip
所以經過兩個nginx之后,獲取到的值是:客戶端ip和上一個nginx的ip
獲取:
request.getHeader("X-Forwarded-For")
X-Forwarded-For $http_x_forwarded_for:
將用戶的真實IP存放到X-Forwarded-For這個變量中(變量名可以自定義)
獲取:
request.getHeader("X-Forwarded-For")
