Laravel Force HTTPS重定向您太​​多次

时间:2018-09-17 11:19:35

标签: php laravel ssl heroku https

我正试图强制每条路由使用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托管我的网页

1 个答案:

答案 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

您应该真正阅读以下段落,这些段落完整地解释了我上面简要描述的内容: