$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-FORwardfor 了, 这个变量的意思, 其实就像是链路反追踪, 从客户的真实 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
来源: http://www.bubuko.com/infodetail-2520239.html