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

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

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

我认为中间件是应该实现这样的东西的地方,但我不能完全理解使用它.

谢谢

UPDATE

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

推荐答案

您可以让它与中间件类一起工作.让我给你一个主意.

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 file,如下所示:

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.因此,只需根据您的喜好调整设置即可.

云焰

我在带有通配符SSL的生产环境中使用了这段代码,代码运行正常.如果我删除&& App::environment() === 'production'并在localhost中测试它,重定向也可以工作.因此,是否安装SSL不是问题.看起来您需要非常关注云焰层,以便重定向到Https协议.

2015年3月23日编辑

多亏了@Adam Link的建议:这可能是由云焰传递的头文件引起的.CloudFlare可能通过HTTP访问您的服务器,并传递一个X-Forwarded-Proto头,该头声明它正在转发HTTPS请求.您需要在中间件中添加另一行,即...

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

...要信任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日-拉维尔v5.7.

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

Php相关问答推荐

SQLSTATE [42S02]:找不到基表或视图:1146 Table eshop. sessions不存在'''

为什么调用干预\映像引发错误驱动程序\GD\Driver not found?

使用.htaccess将任何路由重定向到文件

如何限制WordPress自定义分类术语页面中的术语数量

无法在WooCommerce中发送客户笔记邮箱通知

创建一个新的可变产品及其属性以用于WooCommerce中的变体

在WooCommerce中的本地收件发货方式下添加一个 Select 字段

如何保存基于用户 Select 的复选框 Select 模式

FlySystem v3:使用本地适配器时出现问题

针对给定产品类别的WooCommerce计数审核

从两个日期创建日期范围,然后为范围中的每个日期复制子数组

Woocommerce单一产品Ajax添加到带有自定义购物车项目数据的购物车

如何在自定义邮箱内容中获取WooCommerce订单项目的详细信息?

打折时更改 Woocommerce 产品名称

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

PHP Laravel 迁移文件不创建关系

Docker-用于部署的 PHP 应用程序映像无法在本地运行

使用自定义插件中的 WooCommerce 模板发送自定义邮箱

正则表达式抓取递归括号的内容

在 EasyAdmin 中添加全局操作,将我的按钮放在表格下方而不是上方