如何在 Laravel Vapor 应用程序中获取 HTTP 请求的 IP?

How can I get the IP of an HTTP request in a Laravel Vapor application?

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

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

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

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

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

    }

"we do not have a load balancer set up" 是的,你知道。 API 网关从根本上说是一种代理,正是受信任的代理配置所针对的那种代理。

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

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

您可以取回ip:

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

我今天与 Vapor 支持人员进行了交谈。他们告诉我保留 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()

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

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

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

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

如果您正在查找应用程序正在访问的客户端 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;
}

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