引言
在使用网上找到的 NGINX 反向代理配置时,我发现获取的客户端 IP 地址总是显示为 127.0.0.1。本文将详细探讨这一问题的成因,并提供有效的解决方法。
目录
案例分析
- 网上抄的配置:结果拿到的客户端IP是 127.0.0.1
txt
location /api {
proxy_pass http://127.0.0.1:8088/v2-api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
- 修改后的配置:拿到的客户端真实IP
txt
location /api {
proxy_pass http://127.0.0.1:8088/v2-api;
proxy_set_header Host $host;
# 注释了这一行
# proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
原因
- remote_addr(AI解释)
当Nginx前面有代理服务器(如负载均衡器、CDN等)时,客户端的请求首先到达代理服务器,然后由代理服务器转发到Nginx。在这种情况下,Nginx看到的 remote_addr 是代理服务器的IP地址,而不是客户端的真实IP地址。
结论
上述修改虽然注释了X-Real-IP,但实际上是去掉remote_addr,让代码能获取到proxy_add_x_forwarded_for的值,这也是在看过Solon框架的源码发现的
java
String ip = ctx.header("X-Real-IP");
if (Utils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
ip = ctx.headerOrDefault("X-Forwarded-For", "");
if (ip.contains(",")) {
ip = ip.split(",")[0];
}
}
实际上配置为 proxy_set_header X-Real-IP $proxy_add_x_forwarded_for; 也是一样
参考资料
- [1] 参考博文