如何在负载平衡器 (ssl_termination) 后面使用 Laravel 5 配置 SSL?

How do I configure SSL with Laravel 5 behind a load balancer (ssl_termination)?

我有一个 laravel 5 项目部署到 AWS EC2 Web 实例,在带有 SSL 终止的 ELB 后面。

对于资产之类的东西,Laravel 默认情况下使用当前使用的任何方案。但是,我注意到,由于 https 流量由 ELB 解密并通过 http 转发到 EC2 节点,Laravel 认为它当前不使用 https,因此将 http 用于资产。这显然会导致问题。

根据我的发现,Laravel 使用 X_FORWARDED_PROTO header 检查此类代理设置。但是我发现这个 header 不存在,取而代之的是一个 HTTP_X_FORWARDED_PROTO header。在 researching this 中,我发现 "HTTP_" 是 php 的作用。如果这是真的,那么为什么 Laravel 不检查它,因为它是一个纯粹的 php 框架?

我读过文章说要使用类似 Fideloper's Trusted Proxies 的东西,但不清楚为什么 Laravel 默认不检查这些 header。

如何配置 Laravel 以接受 HTTP_X_FORWARDED_* headers,或以其他方式配置它以了解我当前的方案是 https?

Laravel 默认情况下不会检查这些,因为这些 headers 可以被简单地注入到请求中(即伪造),并且这会在您的应用程序中创建理论上的攻击向量。恶意用户可以 Laravel 认为请求安全或不安全,这反过来 可能 导致某些东西被破坏。

当我 运行 几个月前使用 Laravel 4.2 遇到同样的问题时,我的解决方案是创建一个自定义请求 class 并告诉 Laravel 使用它她

#File: bootstrap/start.php
//for custom secure behavior -- laravel autoloader doesn't seem here yet?
require_once realpath(__DIR__) . 'path/to/my/MyCustomRequest.php';

Illuminate\Foundation\Application::requestClass('MyCustomRequest');

然后在 MyCustomReuqestClass 中,我扩展了基本请求 class 并添加了额外的 is/is-not 安全逻辑

class Request extends \Illuminate\Http\Request
{
    /**
     * Determine if the request is over HTTPS, or was sent over HTTPS
     * via the load balancer
     *
     * @return bool
     */
    public function secure()
    {        
        $secure = parent::secure();
        //extra custom logic to determine if something is, or is not, secure
        //...
        return $secure;
    }    

    public function isSecure()
    {

        return $this->secure();
    }
}

我现在不会这样做。使用该框架几个月后,我意识到 Laravel 的请求 class 将 Symfony 请求 class 作为 parent,意思是 Laravel 请求继承了 Symfony 请求 object 的行为。

这意味着您可以告诉 Laravel 它应该信任哪些代理服务器

Request::setTrustedProxies(array(
    '192.168.1.52' // IP address of your proxy server
));

此代码告诉 Laravel 它应该信任哪些代理服务器。在那之后,它应该选择标准 "forwarded for" headers。您可以在 Symfony docs.

中阅读有关此功能的更多信息