某些路由的 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.
我最近在我的服务器上切换到使用 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.