码迷,mamicode.com
首页 > 其他好文 > 详细

关于nginx获取真实ip,proxy_set_head设置头部信息的理解

时间:2018-03-08 18:09:20      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:代理模块 真是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设置头部信息的理解

标签:代理模块 真是ip   代理模块 真是ip代理模块 真是ip代理   

原文地址:http://blog.51cto.com/wks97/2084302

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!