nginx代理后想获取用户的真实IP,
1.在http 模块内增加map模块参数:
map $http_x_forwarded_for $clientRealIp { "" $remote_addr; ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr; }
2.修改upstream模块的ip_hash参数:
hash $clientRealIp;
3.修改两处location模块的proxy_set_header参数:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 要加上以下俩个参数要不会报错
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
# 要加上以下俩个参数要不会报错
1. 几个概念
remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.
X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded-For: client, proxy1, proxy2
X-Real-IP:自定义的HTTP头,用于把客户端真实IP一层层传递下去。
2.几个变量
$remote_addr:上层IP(客户端或代理)
$proxy_add_x_forwarded_for:包括客户端请求头的X-Forwarded-For和$remote_addr
$http_x_forwarded_for:就是X-Forwarded-For的值
3. 获取客户端真实IP的方法
3.1 通过设置X-real-IP层层传递
首层代理:proxy_set_header X-Real-IP $remote_addr; 针对首层代理,拿到真实IP
非首层代理:proxy_set_header X-Real-IP $http_x_real_ip; # 针对非首层代理,一直传下去
3.2 通过设置X-Forwarded-For请求头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
然后截取X-Forward-For请求头的第一段,即是客户端的真实IP
4. 经过CDN后,获取用户真实IP的方法
4.1 一般CDN都会传递X-Forwarded-For请求头,通过X-Forwarded-For请求头获取用户真实IP。
4.2 后端Nginx配置
http {
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
}
我们通过map自定义了一个变量$clientRealIp;
如果X-Forwarded-For头是空的,那么客户端真实IP就是remote_addr;
如果X-Forwarded-For头非空,我们就通过正则匹配,捕获到第一段,这就是用户的真实IP;
必须注意的是,在每一层代理都要设置X-Forwarded-For头。
参考
多层代理获取用户真实IP - kaka_jon - 博客园
https://www.cnblogs.com/zhaojonjon/p/7293977.html
(26条消息) 代理后端的 Nginx 限制真实客户端IP访问问题_人生就是一场修行-CSDN博客_nginx限制客户端ip
https://blog.csdn.net/fgf00/article/details/82260249