某些路由的 HTTP 未重定向到 HTTPS

HTTP not being redirected to HTTPS for certain Routes

我最近在我的服务器上切换到使用 HTTPS,我在网上发现一些代码强制所有传入服务器的请求使用 HTTPS:

<?php namespace App\Http\Auth\Middleware;

use Closure;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
        if (!$request->secure() && env('APP_ENV') === 'production') {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }

}

并添加 \App\Http\Auth\Middleware\HttpsProtocol::class 到我的中间件。

但是现在我有以下路线:

Route::controller('test', 'TestController');

以及以下控制器:

<?php namespace App\Http\FrontEnd\Controllers;

use App\Http\FrontEnd\Requests;
use App\Http\FrontEnd\Controllers\Controller;

use Illuminate\Http\Request;
use App\Http\FrontEnd\Requests\TestRequest;

use App\Commands\SendEmail, App\Commands\SendSMS;

use Auth, Input, DB, Session, Queue, Crypt;

class TestController extends Controller {

    public function postCheck()
    {
        //
    }

    public function postConfirm()
    {
        //
    }

}

现在,如果我尝试 post 到以下 URL:

,那条特定路线将不起作用
/test/confirm

它仅在我使用 https 时有效,我不明白为什么或如何解决它。

您可能想看看这个 question/answer:

虽然该问题涉及 htaccess 重定向,但原理是相同的。

基本上,当客户端访问 URL 的 http 版本时,您的代码会通过 302 重定向响应客户端,告诉它使用 https URL.客户端随后向 https URL 发出新请求,但它错误地使用了 GET 请求并且还丢弃了原始 POST 数据。

为了解决客户端错误地更改重定向请求方法的问题,他们提出了一个新的重定向状态代码 307,该代码在实施时专门用于在不修改请求方法的情况下进行重定向。您可以尝试通过响应 307 来解决此问题,但由于它是在 HTTP/1.1 中引入的,因此无法保证客户会理解如何处理它。

要在您的代码中使用 307 重定向进行响应:

return redirect()->secure($request->getRequestUri(), 307);

但是,任何变通办法实际上都违背了要求所有地方使用 HTTPS 的目的。如果客户端 POST 连接到不安全的 URL,则 post 数据可能已经被泄露。你最好的选择是实际上只是拒绝 POST 对不安全 URL 的请求,以确保人们不认为 POST 对你的不安全 URL 是可以的]s.