PHP 中获取 Nginx 使用反向代理或 CDN 后的客户端真实 IP
获取 Nginx 反向代理后的客户端 IP,基本是按一定顺序检测以下参数中的信息: HTTP_CLIENT_IP HTTP_X_REAL_FORWARDED_FOR HTTP_X_FORWARDED_FOR REMOTE_ADDR 在未使用 CDN 和反向代理情况下 当业务服务器直接暴露在公网上,并且未使用 CDN 和反向代理服务器时,可以直接使用 remote_addr: $_SERVER['REMOTE_ADDR'] 这时候 HTTP_X_FORWARDED_FOR 和 HTTP_X_REAL_IP 都是可以被伪造的,但 REMOTE_ADDR 是客户端和服务器的握手 IP,即 client 的出口 IP,伪造不了。 在使用 CDN 和反向代理情况下 铁律 当多层代理或使用 CDN 时,如果代理服务器不把用户的真实 IP 传递下去,那么业务服务器将永远不可能获取到用户的真实 IP。 如果 WEB 服务器上层也是使用 Nginx 做代理或负载均衡,则需要在代理层的 Nginx 配置中明确 XFF 参数,累加传递上一个请求方的 IP 到 header 请求中。以下是代理层的 Nginx 配置参数。 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; 只有一层代理的情况 我们按上面的配置发起一个伪造请求,10.100.11.25 是我电脑的 IP,链路为: ...