应用放在 Nginx 后面,日志里记录的访问 IP 全是 127.0.0.1,怎么拿到用户的真实 IP?
1 个回答
Mores小栋博客!反向代理以后,和应用建立连接的是 Nginx,应用看到的来源地址自然是 Nginx 所在的地址。需要 Nginx 把真实 IP 放在请求头里转发给应用:
Nginxlocation / { proxy_pass http://127.0.0.1:3000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }应用这边读取这些请求头。很多框架有专门的设置,比如 Express 的
app.set("trust proxy", 1),设置后req.ip就是真实 IP。如果 Nginx 前面还有 CDN,
$remote_addr拿到的是 CDN 节点的地址。这时要用 realip 模块,从 CDN 传来的请求头里取出用户 IP:Nginxset_real_ip_from 10.0.0.0/8; # 换成 CDN 公布的回源 IP 段 real_ip_header X-Forwarded-For; real_ip_recursive on;注意安全:
X-Forwarded-For可以被客户端伪造,只能信任来自你自己的代理或 CDN 的那部分。不要直接拿请求里原始的X-Forwarded-For做限流或者风控判断。
正在读取登录状态…
暂无讨论,说说你的看法吧