我正在做我的第一个Laravel 5项目,我不确定在哪里或者如何在我的应用程序上放置强制HTTPS的逻辑。这里的关键是,有许多指向该应用程序的域,并且只有三分之二的域使用SSL (第三个是回退域,说来话长)。因此,我希望在我的应用程序逻辑中处理这个问题,而不是.htaccess。
在Laravel4.2中,我使用位于filters.php中的代码完成了重定向
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});我认为应该在中间件上实现这样的东西,但我不能完全使用它来解决这个问题。
谢谢!
更新
如果你像我一样使用Cloudflare,这可以通过在控制面板中添加一个新的页面规则来实现。
发布于 2015-02-09 14:22:15
您可以使用Middleware类来使其工作。让我给你一个想法。
namespace MyApp\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class HttpsProtocol {
public function handle($request, Closure $next)
{
if (!$request->secure() && App::environment() === 'production') {
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}然后,将此中间件应用于每个在Kernel.php文件中添加设置规则的请求,如下所示:
protected $middleware = [
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
'Illuminate\Cookie\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
// appending custom middleware
'MyApp\Http\Middleware\HttpsProtocol'
];在上面的示例中,如果满足以下条件,中间件会将每个请求重定向到https:
production,则当前请求没有安全协议(Http)Cloudflare
我在生产环境中使用了这段代码和WildCard安全套接层,代码工作正常。如果我删除&& App::environment() === 'production'并在本地主机上测试它,重定向也可以工作。所以,有没有安装SSL并不是问题。看起来你需要非常注意你的Cloudflare层,以便重定向到Https协议。
编辑2015年3月23日
多亏了@Adam Link的建议:这很可能是由于Cloudflare传递的报头造成的。CloudFlare很可能会通过超文本传输协议访问你的服务器,并传递一个X-Forwarded-Proto报头,声明它正在转发一个HTTPS请求。你需要在你的中间件中添加另一行,上面写着...
$request->setTrustedProxies( [ $request->getClientIp() ] ); ...to信任CloudFlare发送的报头。这将停止重定向循环
编辑2016年9月27日- Laravel v5.3
只需要将中间件类添加到kernel.php file中的web组中
protected $middlewareGroups = [
'web' => [
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// here
\MyApp\Http\Middleware\HttpsProtocol::class
],
];请记住,默认情况下,
web组应用于每个路由,因此您不需要在路由或控制器中显式设置web。
编辑2018年8月23日- Laravel v5.7
App::environment() === 'production'的环境来重定向请求。对于之前的版本是env('APP_ENV') === 'production'.\URL::forceScheme('https');实际上不会重定向。一旦网站呈现出来,它就会与https://建立链接。发布于 2016-10-02 22:10:02
另一个对我有效的选项是,在AppServiceProvider中将以下代码放在引导方法中:
\URL::forceScheme('https');在https(‘forceSchema’)之前编写的函数错误,它的forceScheme
发布于 2017-04-26 20:00:50
或者,如果您正在使用Apache,那么您可以使用.htaccess文件来强制您的URL使用https前缀。在Laravel 5.4上,我在.htaccess文件中添加了以下几行代码,这对我来说很有效。
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]https://stackoverflow.com/questions/28402726
复制相似问题