【问题标题】: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 断开连接,您的程序也能顺利运行的原因。

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多