如何在 Cloudflare 或负载均衡器后获取访客真实 IP
位于代理之后的服务器如何安全获取访客真实 IP,含 Nginx、Node.js 和 PHP 示例。
为什么 IP 看起来不对
当 Cloudflare、负载均衡器或 Nginx 位于网站前面时,服务器收到的连接来自该代理,因此你看到的是代理的 IP 而不是访客的 IP。访客 IP 在代理添加的请求头中。
Cloudflare
Cloudflare 会把单个访客 IP 放在 CF-Connecting-IP 请求头中。为确保请求确实来自 Cloudflare,只有当连接 IP 位于 Cloudflare 公布的 IP 段(cloudflare.com/ips)内时才信任该请求头。
X-Forwarded-For
请求经过多个代理时,X-Forwarded-For 会收集各代理的 IP,以逗号分隔。第一个值被视为访客 IP,但访客可以自行填写,因此应从你自己的代理最后添加的值开始往前数,使用可信位置上的值。
Nginx
使用 real_ip 模块,在 set_real_ip_from 中列出你的代理 IP 段,并将 real_ip_header 设为 CF-Connecting-IP 或 X-Forwarded-For。之后日志和应用拿到的就是访客 IP。
Node.js 和 PHP
在 Express 中设置 app.set("trust proxy", 代理数量),req.ip 即为访客 IP。在 PHP 中,只有当 $_SERVER["REMOTE_ADDR"] 是你自己的代理时,才使用 $_SERVER["HTTP_CF_CONNECTING_IP"]。
验证
配置完成后,如果网站记录的 IP 与 IPinfoBox 首页显示的 IP 一致,就说明生效了。
现在就查看你的 IP 和位置。
查看我的 IP