bounty将在4天后过期。回答此问题可获得+50的声望奖励。Ignas Damunskis正在寻找来自知名来源的答案:还是没解决问题,不知道该怎么办。
我尝试使用$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);
// ...
但这并没有解决问题。
我做错了什么?
2条答案
按热度按时间b1payxdu1#
“公共IP”-如“How can I get client real ip address in PHP?“中所述
通常,当通过Internet访问您的服务时,可以找到公共IP地址。
你的PHP应用程序不知道你的公共IP地址,因为它是在专用网络中。公共IP地址是由你的ISP/路由器分配给你的。路由器NAT专用IP地址,所以只有1个IP地址被分配给你的专用网络。
这意味着您需要依靠反向代理(在您的情况下是NGiNX)来正确填充
HTTP_X_FORWARDED_FOR
,其中you can try and read:或者使用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
个同样,这取决于面向Internet的反向代理设置了什么。
monwx1rj2#
您没有做错任何事情,PHP可能只是报告了您的主机在局域网(LAN)中的IP地址。
172.19.0.2
是一个专用IP地址:此IP由路由器分配给您的计算机,并且是内部的,在互联网上不可见。
您的路由器充当NAT设备:您的所有计算机、电话、小工具......在您的LAN中被分配了不同且唯一的私有IP地址,并且它们使用路由器连接到Internet。只有路由器被分配了公共IP地址,并且它是您的网络中可直接从Internet访问的唯一设备:除非你配置端口转发或类似的东西到某个设备,其余的设备只是接收响应的一切,他们发送到互联网。
Google和其他服务会告诉您您的IP地址,因为它们在您的局域网之外,可以看到您的公共IP地址:但同样,从应用程序的Angular 来看,PHP只能看到内部私有IP地址;事实上,它不需要任何其他东西:这就是为什么你的程序运行平稳,即使你从互联网断开。