为jwilder/nginx-proxy配置Symfony的可信代理

4dc9hkyq  于 2022-11-02  发布在  Nginx
关注(0)|答案(2)|浏览(182)

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);
// ...

但这并没有解决问题。
我做错了什么?

b1payxdu

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

$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

同样,这取决于面向Internet的反向代理设置了什么。

monwx1rj

monwx1rj2#

您没有做错任何事情,PHP可能只是报告了您的主机在局域网(LAN)中的IP地址。
172.19.0.2是一个专用IP地址:

此IP由路由器分配给您的计算机,并且是内部的,在互联网上不可见。
您的路由器充当NAT设备:您的所有计算机、电话、小工具......在您的LAN中被分配了不同且唯一的私有IP地址,并且它们使用路由器连接到Internet。只有路由器被分配了公共IP地址,并且它是您的网络中可直接从Internet访问的唯一设备:除非你配置端口转发或类似的东西到某个设备,其余的设备只是接收响应的一切,他们发送到互联网。
Google和其他服务会告诉您您的IP地址,因为它们在您的局域网之外,可以看到您的公共IP地址:但同样,从应用程序的Angular 来看,PHP只能看到内部私有IP地址;事实上,它不需要任何其他东西:这就是为什么你的程序运行平稳,即使你从互联网断开。

相关问题