4

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

我查看了https://laravel.com/docs/5.6/requests#configuring-trusted-proxies上的 Trusted Proxy 文档,但我们没有设置负载均衡器,因此该解决方案似乎不相关。我怀疑这个 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);

    }
4

5 回答 5

10

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

您可以检索IP:

Request::header('x-vapor-source-ip')
于 2019-11-04T15:45:56.953 回答
4

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

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

于 2019-10-11T18:46:04.447 回答
1

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

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

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

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

于 2022-01-07T13:36:21.053 回答
0

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

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()

于 2020-12-10T18:18:36.483 回答
0

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

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

于 2022-01-12T10:35:25.050 回答