Laravel 配置强制 https

Laravel configurate force https

我们的网站托管在负载平衡服务器上。 SSL 卸载在防火墙上完成,因此客户端被反向代理到 Web 服务器场。

当 https 请求到达我们的 Laravel 应用程序时,服务器变量 HTTPS 为空并且 Laravel 似乎没有检测到 https 模式并生成 urls(资产 &路线)如:

有没有办法配置 Laravel 以强制 url 生成 https 链接? 我们更喜欢配置解​​决方案,因为我们有一个不在 https.运行 下的开发和暂存环境。

注意事项: 我们已经尝试了 fideloper 的 "trustedproxy" 方法,结果没有任何变化。 我认为 .htaccess 重写不是一个选项,因为 htaccess 重写基于相同的 https header(我们没有收到)或端口(80,laravel 调用端口 443)。

感谢您的帮助。

Laravel 的 UrlGenerator class 有一个名为 forceSchema 的方法,它允许您强制使用模式并忽略从请求中提取的模式URL。只需创建一个服务提供者 SecureRoutingServiceProvider,它使用 Laravel 的 IOC 来覆盖默认生成器和 return 一个强制安全模式的实例:

use Illuminate\Routing\UrlGenerator;
use Illuminate\Routing\RoutingServiceProvider;

class SecureRoutingServiceProvider extends RoutingServiceProvider
{
    public function boot()
    {
        App::bind('url', function () {
            $generator = new UrlGenerator(
                App::make('router')->getRoutes(),
                App::make('request');
            });

            $generator->forceSchema('https');

            return $generator;
        }

        parent::boot();
    }
}

接下来我们需要通过将服务提供者添加到 app/config/app.php 中的 providers 数组来注册服务提供者:

'providers' => array(
    ...,
    'SecureRoutingServiceProvider',
)

仅此而已。我已经测试了这段代码并且它工作正常(在 Laravel 4.2)。

正在处理与 Laravel 5 分页功能相同的问题。为此,仅在生成器中强制使用 URL 模式是不够的,因为它使用与请求关联的 URL。挖掘后我找到了一个很好的修复。

Illuminate\Http\Request 有一个基本用于这种情况的 trustedProxies 数组。

我仍然使用来自 Bogdan 的 SecureRoutingServiceProvider 作为将我们的负载均衡器列入白名单的起点。

public function boot()
{
    Request::setTrustedProxies(['10.0.0.X']); // Here should be your internal LB IP

    parent::boot();
}

之后效果很好。当然,您应该将 IP 放在 config/env 文件中。