如何在 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;
}
你可以试试这个功能。谢谢
我最近将 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;
}
你可以试试这个功能。谢谢