IPinfoBox

如何在 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