📜  什么是 Laravel 中的 Trustproxies 处理 - PHP (1)

📅  最后修改于: 2023-12-03 14:49:09.221000             🧑  作者: Mango

什么是 Laravel 中的 Trustproxies 处理

在 Laravel 的应用中,我们经常需要获取客户端的 IP 地址。然而,由于一些原因,我们可能会得到错误的 IP 地址。这可能是因为使用了反向代理服务器或负载均衡服务器等。在这种情况下,我们需要配置 Laravel 来使用远程代理服务器的 IP 地址而不是直接使用客户端的 IP 地址。

Laravel 提供了 TrustProxies 中间件来解决这个问题。该中间件将在请求中检查代理头,并使用代理服务器 IP 地址设置 $_SERVER 中的正确值。在这一过程中,中间件还为 Laravel 程序中的其他功能设置正确的属性,以便正确地识别客户端 IP 地址。

配置说明

TrustProxies 中间件需要配置一些属性以了解您要信任哪些代理头,以及如何将这些头文件映射到原始的 IP 地址。

trustedProxies

第一个配置是 $trustedProxies 属性,它是被应用程序信任的代理服务器的 IPv4 或 IPv6 地址列表,以及具有通配符的代理服务器 IP 地址段。此列表由逗号分隔的字符串(或数组)表示。

// config/app.php

'trustedProxies' => [
    '192.168.1.1', // 信任单个 IP 地址
    '192.168.54.0/24', // 信任 IP 地址段
    '2001:0db8:85a3:0000:0000:8a2e:0370:7334', // IPv6 地址
    '192.168.25.78,192.168.25.79', // 多个 IP 地址
],
headers

第二个配置是 $headers 属性,它是一个对映射代理服务器头文件与 Laravel 可以识别的客户端 IP 地址之间的关系的数组。此数组应为具有代理服务器标头的关联数组。

默认情况下,TrustProxies 中间件使用 Laravel 的 $trustedHeaders 属性作为映射关系,此属性包括 Laravel 可以理解的常见代理服务器头文件。

// vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrustProxies.php

/**
 * The mappings of headers to trusted proxies.
 *
 * @var array
 */
protected $headers = [
    Request::HEADER_FORWARDED => 'FORWARDED',
    Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
    Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
    Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
];

如果代理服务器使用的标头不是 Laravel 中默认的标头,请可以覆盖 $headers 属性定义自己的代理服务器的标头。例如:

// config/app.php

'trustedProxies' => [
    '192.168.1.1',
    '192.168.54.0/24',
],

'headers' => [
    // 自定义头文件映射
    \Illuminate\Http\Request::HEADER_FORWARDED => 'X_FORWARDED',
    \Illuminate\Http\Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR_CUSTOM',
],
中间件的使用

要在应用程序中使用 TrustProxies 中间件,您可以将其添加到应用程序中的 $middlewareGroups 数组中的 web 组。web 组包含在应用程序的 routes/web.php 路由文件中定义的所有路由。

// app/Http/Kernel.php

protected $middlewareGroups = [
    'web' => [
        // ...
        \Illuminate\Foundation\Http\Middleware\TrustProxies::class,
    ],

    // ...
];

这样,每当在 web 组中定义的路由中收到一个请求时,TrustProxies 中间件将自动运行并更新 $_SERVER 中的正确客户端 IP 地址。现在,您可以在应用程序中的任何地方使用 Illuminate\Http\Request 来获取正确的客户端 IP 地址了。

// app/Http/Controllers/Controller.php

public function index(Request $request)
{
    $ip = $request->ip(); // 获取正确的 IP 地址
    // ...
}
总结

TrustProxies 中间件是一个很好的 Laravel 功能,它可以帮助您在使用反向代理服务器或负载平衡服务器时解决应用程序中的 IP 地址获取问题。通过按照上述说明正确配置 TrustProxies 中间件,您可以轻松获取以正确格式识别客户端 IP 地址的好处。