Heroku 有以下文档,用于在使用 Laravel 时配置可信代理:
https://devcenter.heroku.com/articles/getting-started-with-laravel#trusting-the-load-balancer
它说:
防止 Laravel 信任也非常重要 Forwarded 和 X-Forwarded-Host 标头,因为 Heroku 的路由器具有 不设置这些,但 Symfony 的 Request 组件信任它们 一旦设置了可信代理,就会出现框。
最终的配置文件应该如下所示:
<?php
return [
'proxies' => '*',
'headers' => [
Illuminate\Http\Request::HEADER_FORWARDED => null, // not set on AWS or Heroku
Illuminate\Http\Request::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
Illuminate\Http\Request::HEADER_CLIENT_HOST => null, // not set on AWS or Heroku
Illuminate\Http\Request::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
Illuminate\Http\Request::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
]
];
Laravel 有自己的有关如何配置可信代理的文档:
https://laravel.com/docs/5.6/requests#configuring-trusted-proxies
我很困惑,因为正如您在 Laravel 文档的示例中看到的:
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];
/**
* The headers that should be used to detect proxies.
*
* @var string
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
$headers
属性是一个字符串,而不是一个数组。我期待看到一个数组,我可以在其中添加标头映射,就像 Heroku 文档所说的那样,但我不知道如何使用 $headers
字符串属性来做到这一点。
为 Heroku 设置此中间件的适当方法是什么,以便我仍然可以按照 Heroku 的建议“防止 Laravel 信任
Forwarded
和 X-Forwarded-Host
标头”?
首先,一些背景知识。不过你可能知道第一部分。
Heroku 文档仍然提到 TrustedProxy 尚未被引入 Laravel 核心本身的时间,这种情况发生在 5.5 中。从 5.5 开始,我们通过 Laravel 中包含的中间件进行这些设置,而不是像 5.5 之前那样从受信任的代理发布配置文件(顺便说一句,您仍然可以在安装该包后对其进行操作 - 但如果您不这样做,则不应该这样做) 5.5+ 上的文档最初让我感到困惑。)。我想你已经明白了。
关于你问题的主要内容。
我自己运行 5.5 LTS(在 Heroku 上),所以我没有遇到这个确切的问题 - 在 5.5 上,
$headers
属性仍然是一个数组,如here所示。
在 5.6 中,symfony 升级到了版本 4,变化很大。 5.6 文档链接到 this,这可能是值得一看的内容。
抱歉,目前这还不是完整的答案。我想我只是把我所知道的说出来,希望对你有帮助。
如果有人正在寻找有关此主题的 2024 年 Laravel 11 更新:
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\App\Http\Middleware\HandleInertiaRequests::class,
\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
]);
$middleware->trustProxies(at: '*');
$middleware->trustProxies(
headers: Request::HEADER_X_FORWARDED_AWS_ELB
);
$middleware->trustHosts(at: ['mysite.com', 'www.mysite.com',], subdomains: false);
})