要让后端获取真实访客IP,需Nginx用proxy_set_header X-Real-IP $remote_addr;透传,并在可信代理段配置set_real_ip_from与real_ip_header;后端须主动读取X-Real-IP头,不可依赖REMOTE_ADDR。

要让后端正确获取真实访客 IP,关键在于 Nginx 正确传递客户端真实 IP,并在后端代码中主动读取 X-Real-IP(而非 REMOTE_ADDR)。
确保 Nginx 正确设置 X-Real-IP
Nginx 默认的 $remote_addr 是上游代理(如负载均衡器或 CDN)的 IP,不是用户真实 IP。需用 proxy_set_header X-Real-IP $remote_addr; 将它透传给后端。但要注意前提:
- 如果 Nginx 前面还有 CDN 或反向代理(如 Cloudflare、SLB),
$remote_addr只是那个代理的 IP,此时应改用$http_x_forwarded_for中最左边的非私有 IP(需配合set_real_ip_from和real_ip_header X-Forwarded-For;) - 若 Nginx 是直接面向公网(无前置代理),
$remote_addr就是真实用户 IP,可直接使用 - 务必在
location或server块中配置,且位于proxy_pass之前
后端必须主动读取 X-Real-IP 头
大多数 Web 框架默认不信任请求头中的 IP,而是直接取 TCP 连接的远端地址(即 Nginx 的 IP)。需手动从 X-Real-IP 头中提取:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- Node.js(Express):
req.headers['x-real-ip'] || req.ip(注意启用trust proxy后req.ip才会解析X-Forwarded-For) - Python(Django):
request.META.get('HTTP_X_REAL_IP');Flask:request.headers.get('X-Real-IP') - PHP:
$_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] - Java(Spring Boot):
request.getHeader("X-Real-IP")
安全提醒:只信任可信代理链上的头
攻击者可伪造 X-Real-IP 请求头。Nginx 必须限制仅从可信代理(如公司内网 IP、CDN 回源段)接收并信任该头:
- 在
http或server块中添加:set_real_ip_from 10.0.0.0/8;(替换为你的可信代理网段) - 紧接着写:
real_ip_header X-Real-IP;(表示从该头取真实 IP) - 或更常用:
real_ip_header X-Forwarded-For;+real_ip_recursive on;,配合X-Forwarded-For多层解析 - 未配置
set_real_ip_from时,real_ip_header不生效,$remote_addr仍为代理 IP
验证是否生效
快速确认链路是否正常:
- 在 Nginx 配置中临时加一行:
add_header X-Debug-Real-IP $remote_addr;,看响应头是否为用户真实 IP - 后端打印所有请求头,检查
X-Real-IP是否存在且值合理(非 127.0.0.1、内网地址或明显代理 IP) - 用 curl 模拟请求:
curl -H "X-Real-IP: 1.2.3.4" http://your-site/,观察后端是否返回该值——若返回了,说明未做可信源校验,存在安全隐患

















