Laravel Force HTTPS перенаправил вас слишком много раз - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь заставить каждый маршрут использовать 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',
    ],
];

Когда я пытаюсь получить доступ к своей странице, он говорит: Эта страница не работает на тестовой странице.herokuapp.com перенаправил вас слишком много раз.

Я использую heroku для размещения своей веб-страницы

1 Ответ

0 голосов
/ 17 сентября 2018

Это не только ваше промежуточное ПО. Heroku использует балансировку нагрузки для лучшего распределения рабочих нагрузок.

Кроме того, из документации Heroku:

HTTP-маршрутизация Heroku направляет каждый запрос через уровень обратных прокси-серверов, которые, помимо прочего, отвечают за балансировку нагрузки и разрыв SSL-соединений. Это означает, что запросы, полученные dyno, будут иметь IP-адрес последнего маршрутизатора в переменной среды REMOTE_ADDR, и внутренний запрос всегда будет выполняться с использованием протокола HTTP, даже если исходный запрос был сделан по HTTPS.

Если вы используете 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;
}

Кстати, я использую API, написанный с Laravel для Heroku, и вот свойство middleware моего Kernel.php:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Api\Http\Middleware\TrustProxies::class,
    \Api\Http\Middleware\RedirectToHttps::class,
    \Api\Http\Middleware\PreflightCors::class,
    \Api\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class
];

Вы действительно должны прочитать эти параграфы, которые полностью объясняют то, что я кратко описал выше:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...