Laravel 5-重定向到HTTPS

NightMICU:

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

在Laravel 4.2中,我使用以下代码完成了重定向filters.php

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

我在想应该在中间件中实现类似这样的东西,但是我不能完全理解使用它。

谢谢!

更新

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

manix:

您可以使其与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:

  1. 当前请求没有安全协议(http)
  2. 如果您的环境等于production因此,只需根据您的喜好调整设置。

云耀斑

我在具有WildCard SSL的生产环境中使用此代码,并且代码可以正常工作。如果我&& App::environment() === 'production'在本地主机中删除并对其进行测试,则重定向也有效。因此,是否安装SSL并不是问题。看来您需要非常注意Cloudflare层才能重定向到Https协议。

编辑23/03/2015

感谢@Adam Link的建议:很可能是Cloudflare传递的标头引起的。CloudFlare可能通过HTTP命中了您的服务器,并传递了X-Forwarded-Proto标头,该标头声明其正在转发HTTPS请求。您需要在中间件中添加另一行,说明...

$request->setTrustedProxies( [ $request->getClientIp() ] ); 

...信任CloudFlare发送的标头。这将停止重定向循环

编辑27/09/2016-Laravel 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-Laravel v5.7

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章