如何在 Laravel 5.6 上为 Heroku 配置可信代理中间件

问题描述 投票:0回答:3

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
标头”?

laravel heroku
3个回答
1
投票

首先,一些背景知识。不过你可能知道第一部分。

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,这可能是值得一看的内容。

抱歉,目前这还不是完整的答案。我想我只是把我所知道的说出来,希望对你有帮助。


0
投票

根据文档,这是您应该通过的:

HEADER_X_FORWARDED_AWS_ELB

它引用了AWS ELB,但对于Heroku来说应该是相同的,因为它不发送“X-Forwarded-Host”


0
投票

如果有人正在寻找有关此主题的 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);
})
© www.soinside.com 2019 - 2024. All rights reserved.