Laravel 5 - 重定向至HTTPS

2022-08-30 06:50:44

在我的第一个Laravel 5项目上工作,不确定在哪里或如何放置逻辑来强制在我的应用程序上使用HTTPS。这里的关键是,有许多域指向该应用程序,并且只有三分之二使用SSL(第三个是回退域,长话短说)。因此,我想在我的应用程序的逻辑中处理这个问题,而不是.htaccess。

在Laravel 4.2中,我使用此代码完成了重定向,位于:filters.php

App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

我认为中间件是应该实现这样的东西的地方,但我不能完全弄清楚使用它。

谢谢!

更新

如果您像我一样使用Cloudflare,则可以通过在控制面板中添加新的页面规则来完成。


答案 1

您可以使其与中间件类一起使用。让我给你一个想法。

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:

  1. 当前请求没有安全协议 (http)
  2. 如果您的环境等于 。因此,只需根据您的喜好调整设置即可。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

只需将中间件类添加到以下组中即可:webkernel.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

    ],
];

请记住,默认情况下,组应用于每个路由,因此无需在路由或控制器中显式设置。webweb

编辑 23/08/2018 - 拉拉维尔 v5.7

  • 要根据环境重定向请求,可以使用 。对于以前的版本是 。App::environment() === 'production'env('APP_ENV') === 'production'
  • 使用实际上不会重定向。它只是在网站呈现后建立链接。\URL::forceScheme('https');https://

答案 2

另一个对我有用的选项,在AppServiceProvider中将此代码放在引导方法中:

\URL::forceScheme('https');

在 forceSchema('https') 之前编写的函数是错误的,它的 forceScheme


推荐