【问题标题】:How can I get the IP of an HTTP request in a Laravel Vapor application?如何在 Laravel Vapor 应用程序中获取 HTTP 请求的 IP?
【发布时间】:2022-01-12 18:35:25
【问题描述】:

我最近将一个 Laravel 应用程序从服务器移到了 Vapor。此应用依赖于使用 Request::ip() 记录请求 IP 地址,但自从切换到 Vapor 后,所有 IP 都记录为 127.0.0.1。

我查看了 https://laravel.com/docs/5.6/requests#configuring-trusted-proxies 的受信任代理文档,但我们没有设置负载均衡器,因此该解决方案似乎不相关。我怀疑这个 IP 地址来自 Amazon API Gateway。

我们如何在 Vapor 上部署的应用中获取传入请求的实际客户端 IP?

我们如何使用 IP 地址的最小示例如下:

public function store(Request $request)
    {
        $workerIP = $request->ip();
        $worker = Worker::create(['ip_address' => $workerIP]);
        return view('workers.show')->withWorker($worker);

    }

【问题讨论】:

  • 嗨!我认为您标记了错误的 Vapor。您标记的是 Swift 框架 vapor.codes
  • @TWOF 真的有 Laravel Vapor 标签吗?
  • @Nathan 现在有。

标签: laravel aws-lambda laravel-vapor


【解决方案1】:

最新的 Vapor 核心包 (vapor-core:v2.2.1) 中有 x-vapor-source-ip 标头,它公开了 Lambda 的 sourceIp 属性,以便安全地获取客户端的真实 IP。

你可以找回ip:

Request::header('x-vapor-source-ip')

【讨论】:

  • 我可以确认这是可行的。不知道为什么这不包含在官方文档中。
【解决方案2】:

“我们没有设置负载平衡器”是的,你有。从根本上说,API 网关是可信代理配置所针对的那种代理。

在您的config/trustedproxy.php 文件中设置'proxies' => '*',您应该会开始看到正确的IP 地址。

【讨论】:

  • 这在 Laravel Vapor 中不起作用,因为在 lambda 之前有两个代理(API 网关和 Cloudfront)。我还没有想出任何方法来安全地检索客户端的 ip。
  • @mikkokut 我会联系 Vapor 支持。 X-Forwarded-For 标头的链应该可以正常工作,但是由于 Vapor 是新的,它们可能还没有完全正确地配置它。
【解决方案3】:

我遇到了同样的问题。建议的x-vapor-source-ip 在使用 CloudFlare 时不起作用,就像您使用 Vapors 临时 URL 时一样。当 Laravel Vapor 位于 CloudFlare 后面时,可以通过以下方式获取用户的 IP 地址:

$request->header('cf-connecting-ip');

在实际域名(非 Vapor 域)上使用:

$request->header('x-vapor-source-ip');

【讨论】:

    【解决方案4】:

    我今天与 Vapor Support 进行了交谈。他们告诉我保持 TrustProxy 默认值,让 Vapor 发挥作用。有用。这是我的 TrustProxy

    class TrustProxies extends Middleware
    {
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies;
    
    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
    }
    

    为了获得IP,我使用request()->ip()

    【讨论】:

      【解决方案5】:

      如果您正在寻找应用程序正在访问的客户端 IP。

      然后您将检查 $_SERVER,您将在那里获得更多信息。

       $_SERVER['HTTP_X_VAPOR_SOURCE_IP']
      

      试试上面的变量,你会得到你的客户端 IP。 Laravel 中的帮助函数也可以帮助您获取 IP。

      function get_client_ip()
      {
        $ipaddress = '';
        if (isset($_SERVER['HTTP_CLIENT_IP']))
          $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
          $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        else if (isset($_SERVER['HTTP_X_FORWARDED']))
          $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        else if (isset($_SERVER['HTTP_FORWARDED_FOR']))
          $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        else if (isset($_SERVER['HTTP_X_VAPOR_SOURCE_IP']))
          $ipaddress = $_SERVER['HTTP_X_VAPOR_SOURCE_IP'];
        else if (isset($_SERVER['HTTP_FORWARDED']))
          $ipaddress = $_SERVER['HTTP_FORWARDED'];
        else if (isset($_SERVER['REMOTE_ADDR']))
          $ipaddress = $_SERVER['REMOTE_ADDR'];
        else
          $ipaddress = 'UNKNOWN';
        return $ipaddress;
      }
      

      你可以试试这个功能。谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-03
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 2011-09-25
        • 1970-01-01
        相关资源
        最近更新 更多