【问题标题】:Configure Symfony's trusted proxies for jwilder/nginx-proxy为 jwilder/nginx-proxy 配置 Symfony 的可信代理
【发布时间】:2022-11-02 03:41:17
【问题描述】:
我正在尝试使用$request->getClientIp(); 获取客户端IP,它返回172.19.0.2,但这不是我的公共IP。
我偶然发现了this doc to set up trusted proxies,所以我尝试这样做:
// web/app_dev.php
// ...
$request = Request::createFromGlobals();
// tell Symfony about your reverse proxy
Request::setTrustedProxies(['172.19.0.0/8'], Request::HEADER_X_FORWARDED_ALL);
$response = $kernel->handle($request);
// ...
但这并没有解决问题。
我究竟做错了什么?
【问题讨论】:
标签:
docker
symfony
nginx
jwilder-nginx-proxy
【解决方案1】:
“公共IP”?如“How can I get client real ip address in PHP?”中所述
通常,通过 Internet 访问您的服务时,可以找到公共 IP 地址。
您的 PHP 应用程序不知道您的公共 IP,因为它位于专用网络中。公共 IP 由您的 ISP/路由器分配给您。路由器对专用 IP 进行 NAT,因此只有 1 个 IP 分配给您的专用网络。
这意味着您需要依靠您的反向代理(在您的情况下为 NGiNX)来正确填充HTTP_X_FORWARDED_FOR,其中you can try and read:
$IParray=array_values(array_filter(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR'])));
或使用this GetClientIP() function,它将检查:
HTTP_CF_CONNECTING_IP
HTTP_X_REAL_IP
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
-
REMOTE_ADDR
同样,这取决于面向互联网的反向代理设置的内容。
【解决方案2】:
您没有做错任何事,PHP 可能只是报告了您在局域网 (LAN) 中主机的 IP 地址。
172.19.0.2 是私有 IP 地址:
此 IP 由您的路由器分配给您的计算机,并且是内部 IP,在 Internet 上不可见。
您的路由器充当 NAT 设备:您的所有计算机、电话、小工具……都在您的 LAN 中分配了一个不同且唯一的私有 IP 地址,它们使用路由器连接到互联网。只有路由器被分配了一个公共 IP 地址,并且它是您网络中唯一可以直接从 Internet 访问的设备:除非您配置端口转发或与某个设备类似的东西,否则其余设备只会收到它们发送的所有内容的响应到互联网。
Google 和其他服务会告诉您您的 IP 地址,因为它们在您的局域网之外并且可以看到您的公共 IP 地址:但同样,从您的应用程序的角度来看,PHP 只能看到内部私有 IP 地址;事实上,它不需要任何其他东西:这就是为什么即使您与 Internet 断开连接,您的程序也能顺利运行的原因。