首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel 5-重定向至HTTPS

Laravel 5-重定向至HTTPS
EN

Stack Overflow用户
提问于 2015-02-09 12:14:43
回答 23查看 242.8K关注 0票数 141

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

在Laravel4.2中,我使用位于filters.php中的代码完成了重定向

代码语言:javascript
运行
复制
App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

我认为应该在中间件上实现这样的东西,但我不能完全使用它来解决这个问题。

谢谢!

更新

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

EN

回答 23

Stack Overflow用户

回答已采纳

发布于 2015-02-09 14:22:15

您可以使用Middleware类来使其工作。让我给你一个想法。

代码语言:javascript
运行
复制
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文件中添加设置规则的请求,如下所示:

代码语言:javascript
运行
复制
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. 如果您的环境等于production,则当前请求没有安全协议(Http)
  2. 。因此,只需根据您的喜好调整设置即可。

Cloudflare

我在生产环境中使用了这段代码和WildCard安全套接层,代码工作正常。如果我删除&& App::environment() === 'production'并在本地主机上测试它,重定向也可以工作。所以,有没有安装SSL并不是问题。看起来你需要非常注意你的Cloudflare层,以便重定向到Https协议。

编辑2015年3月23日

多亏了@Adam Link的建议:这很可能是由于Cloudflare传递的报头造成的。CloudFlare很可能会通过超文本传输协议访问你的服务器,并传递一个X-Forwarded-Proto报头,声明它正在转发一个HTTPS请求。你需要在你的中间件中添加另一行,上面写着...

代码语言:javascript
运行
复制
$request->setTrustedProxies( [ $request->getClientIp() ] ); 

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

编辑2016年9月27日- Laravel v5.3

只需要将中间件类添加到kernel.php file中的web组中

代码语言:javascript
运行
复制
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'.
  • Using,\URL::forceScheme('https');实际上不会重定向。一旦网站呈现出来,它就会与https://建立链接。
票数 277
EN

Stack Overflow用户

发布于 2016-10-02 22:10:02

另一个对我有效的选项是,在AppServiceProvider中将以下代码放在引导方法中:

代码语言:javascript
运行
复制
\URL::forceScheme('https');

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

票数 77
EN

Stack Overflow用户

发布于 2017-04-26 20:00:50

或者,如果您正在使用Apache,那么您可以使用.htaccess文件来强制您的URL使用https前缀。在Laravel 5.4上,我在.htaccess文件中添加了以下几行代码,这对我来说很有效。

代码语言:javascript
运行
复制
RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28402726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档