我们的网站托管在负载均衡的服务器上。 SSL卸载在防火墙上完成,因此客户端反向代理到Web服务器场。
当https请求到达我们的Laravel应用程序时,服务器变量HTTPS为空,Laravel似乎无法检测到https模式并生成网址(资产和路径):
有没有办法配置Laravel强制网址生成https链接? 我们更喜欢配置解决方案,因为我们的开发和暂存环境不能在https下运行。
注意: 我们已经尝试过" trustedproxy"来自fideloper的方法,这导致没有变化。 我认为.htaccess重写不是一个选项,因为htaccess重写基于相同的https标题(我们不接收)或端口(80,laravel调用端口443)。
感谢您的帮助。
答案 0 :(得分:3)
Laravel的UrlGenerator
类有一个名为forceSchema
的方法,它允许您强制使用架构并忽略从请求的URL中提取的架构。只需创建一个服务提供者SecureRoutingServiceProvider
,它使用Laravel的IOC覆盖默认生成器并返回强制安全模式的实例:
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();
}
}
接下来,我们需要通过将服务提供商添加到providers
中的app/config/app.php
数组来注册服务提供商:
'providers' => array(
...,
'SecureRoutingServiceProvider',
)
这就是它的全部内容。我已经测试了这段代码并且工作正常(在Laravel 4.2中)。
答案 1 :(得分:0)
使用Laravel 5分页功能处理同样的问题。因为它不足以强制生成Generator中的URL Schema,因为它使用与Request关联的URL。在挖掘之后我找到了一个很好的解决方案。
Illuminate\Http\Request
有一个trustedProxies数组,基本上就是这种情况。
我仍然使用Bogdan的SecureRoutingServiceProvider
作为我们的Load Balancer白名单的起点。
public function boot()
{
Request::setTrustedProxies(['10.0.0.X']); // Here should be your internal LB IP
parent::boot();
}
之后它运作得很好。当然你应该把IP放在config / env文件中。