对于某些路由,HTTP未被重定向到HTTPS

时间:2016-02-15 16:28:30

标签: laravel laravel-5 routes http-status-code-301

我最近在我的服务器上切换到使用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()
    {
        //
    }

}

如果我尝试发布到以下网址,那么特定路线就不会起作用了:

/test/confirm

它仅在我使用https时有效,我无法理解为什么或如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

您可以查看此问题/答案:Laravel 5 - htaccess HTTPS redirect on post routes doesn't work.

虽然这个问题涉及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,则帖子数据可能已经被泄露。最好的办法是实际上只是拒绝对非安全URL的POST请求,以确保人们不认为可以POST到您的非安全URL。