如何通过Nginx直接获取并返回真实客户端IP
解决Nginx直接返回真实客户端IP的问题
先纠正你配置里的两个核心错误
- Nginx变量名区分大小写,你写的
$X-real-ip是错误写法,正确的变量是$remote_addr(直接连接Nginx的客户端IP)或$http_x_forwarded_for(前置代理传递的客户端IP头)。 return指令必须指定HTTP状态码(比如200),语法不完整会导致配置失效。
分两种场景给出可用配置:
场景1:无前置代理(用户直接访问Nginx)
直接用$remote_addr返回真实IP即可,配置如下:
server { # 你的其他server配置(如监听端口、域名等) location /client-ip { return 200 "$remote_addr"; } }
场景2:有前置代理(如CDN、负载均衡,此时$remote_addr是代理服务器IP)
这种情况需要从代理传递的X-Forwarded-For头里提取真实客户端IP,可通过map指令解析该头的第一个有效IP:
# 在http块下添加map配置,用于解析X-Forwarded-For头 map $http_x_forwarded_for $real_client_ip { ~^(?P<first_ip>[0-9\.]+),?.*$ $first_ip; default $remote_addr; } server { # 你的其他server配置 location /client-ip { return 200 "$real_client_ip"; } }
解释:map指令会匹配X-Forwarded-For头的第一个IP段,若该头不存在或格式异常,会自动 fallback 到$remote_addr。
配置验证步骤
修改后执行nginx -t检查语法正确性,确认无误后执行nginx -s reload重载配置,访问http://你的域名/client-ip即可看到真实客户端IP。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

