我最近在我的服务器上切换到使用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时有效,我无法理解为什么或如何解决这个问题。
答案 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。