我正试图强制每条路由使用HTTPS而不是HTTP
这就是我的方法。我创建了中间件ForceHttps
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
class ForceHttps
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->secure() && App::environment() === 'production'{
return redirect()->secure($request->getRequestUri());
}
return $next($request);
}
}
我已经将此中间件应用于每个网络路线
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\ForceHttps::class, // <----
],
'api' => [
'throttle:60,1',
'bindings',
],
];
当我尝试访问我的页面时,它说: 此页面无效 testpage.herokuapp.com重定向您太多次。
我正在使用heroku托管我的网页
答案 0 :(得分:1)
这不仅仅是您的中间件。 Heroku使用负载平衡来更好地分配工作负载。
此外,来自Heroku文档:
Heroku的HTTP路由通过反向代理层路由每个请求,反向代理负责负载平衡和终止SSL连接。这意味着,dyno接收到的请求将具有REMOTE_ADDR环境变量中的最后一个路由器的IP地址,即使原始请求是通过HTTPS进行的,内部请求也将始终使用HTTP协议进行。
如果您使用的是fideloper/proxy
(如果不使用),请像这样配置TrustProxies
中间件:
<?php
namespace Api\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies = '*';
/**
* The current proxy header mappings.
*
* @var array
*/
protected $headers = Request:: HEADER_X_FORWARDED_AWS_ELB;
}
仅供参考,我正在Heroku上运行用Laravel编写的API,这是我的middleware
的{{1}}属性:
Kernel.php
您应该真正阅读以下段落,这些段落完整地解释了我上面简要描述的内容: