您可以使其与中间件类一起使用。让我给你一个想法。
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:
- 当前请求没有安全协议 (http)
- 如果您的环境等于 。因此,只需根据您的喜好调整设置即可。
production
Cloudflare
我在具有通配符SSL的生产环境中使用此代码,并且代码可以正常工作。如果我在localhost中删除并测试它,重定向也有效。因此,是否安装SSL不是问题所在。看起来你需要非常努力地关注你的Cloudflare层,以便重定向到Https协议。&& App::environment() === 'production'
编辑 23/03/2015
感谢 的建议:这可能是由 Cloudflare 传递的标头引起的。CloudFlare可能会通过HTTP访问您的服务器,并传递一个X-Forwarded-Proto标头,该标头声明它正在转发HTTPS请求。您需要在中间件中添加另一行,上面写着...@Adam Link
$request->setTrustedProxies( [ $request->getClientIp() ] );
...信任 CloudFlare 正在发送的标头。这将停止重定向循环
编辑 27/09/2016 - 拉拉维尔 v5.3
只需将中间件类添加到以下组中即可:web
kernel.php file
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
编辑 23/08/2018 - 拉拉维尔 v5.7
- 要根据环境重定向请求,可以使用 。对于以前的版本是 。
App::environment() === 'production'
env('APP_ENV') === 'production'
- 使用实际上不会重定向。它只是在网站呈现后建立链接。
\URL::forceScheme('https');
https://