Как исправить запрос / маршруты / URL Laravel - он думает, что URL - это http, когда это действительно https - PullRequest
0 голосов
/ 27 сентября 2018

Мой сервер использует SSL и, следовательно, все мои маршруты / URL используют https.Недавно я обнаружил ошибку в Laravel 5.7, которая была обнаружена при попытке использовать проверку электронной почты, которая не работает на сервере с https.Я не буду вдаваться в подробности этой проблемы, так как у меня есть еще один вопрос для этого.Я хочу сохранить это простым.У меня есть следующие настройки в моем файле .env:

APP_USE_HTTPS=true
APP_URL=https://www.example.com
APP_ENV=production

И у меня есть следующее в методе boot () AppServiceProvider

    if (env('APP_USE_HTTPS')) {
        Log::info('AppServiceProvider: forcing URLs to use https');
        URL::forceScheme('https');
    }

И это может быть излишним, нопопытаться решить проблему, я также поместил следующий код в начало моего файла маршрутов web.php: "

if (env('APP_USE_HTTPS')) {
    Log::info('Routes: forcing URLs to use https');
    URL::forceScheme('https');
}

Route::get('/', 'PublicController@getHome');
Route::get('home', 'PublicController@getHome');

Затем в моем методе PublicController.getHome () я поместил этот код:

public function getHome()
{
    $currentPath= Request::fullUrl();
    Log::info($currentPath);

    return view('public.home');
}

Теперь я иду в свой браузер и ввожу это в адресную строку:

https://www.example.com

И я получаю это в моем лог-файле:

AppServiceProvider: forcing URLs to use https
Routes: forcing URLs to use https
http://www.example.com

Итак, как вы можете видетьиз последнего сообщения журнала тот факт, что laravel всегда использует http вместо https, начинает создавать проблемы. Начиная с подписанных маршрутов. Я пытаюсь использовать встроенную проверку электронной почты, но подпись генерируется с использованием маршрута https и отправленной электронной почты.пользователю есть https в URL для возврата на тот же сервер, однако для проверки маршрута используется http (даже если был использован https), поэтому он генерирует другую подпись и, следовательно, все проверяетСбой ссылки на ations с ошибкой 403.

Что-то мне не хватает?Кажется, я не могу найти код, который показывает мне, как Laravel знает, как использовать https или http, или это просто жестко запрограммировано для http?

Спасибо за любую помощь, которую вы можете мне дать.

*** Обновление, чтобы показать проблему с ответом Шаилендры Гупты ****

После реализации промежуточного программного обеспечения ниже приведен код, который я использовал, но, как вы увидите, основная проблема существует во ВСЕХ методах, связанных с URL.Так, например:

$request->secure()

возвращает false даже при использовании https.Затем вызов:

redirect()->secure($request->getRequestUri());

не принесет пользы, потому что это приведет к повторному циклу маршрута в этот метод, который все еще возвращает false для secure (), в основном создавая бесконечный цикл (или слишком много перенаправлений)

class ForceHttpsProtocol {

public function handle($request, Closure $next) {
    Log::info('request uri: '.$request->fullUrl());
    Log::info('secure: '.($request->secure() ? 'yes' : 'no'));

    if (!$request->secure() && env('APP_USE_HTTPS')) {
        return redirect()->secure($request->getRequestUri());
    }

    return $next($request);
}

}

Журнал из вышеприведенного кода будет выдавать следующее, когда вы совершаете 1 попытку перейти на любую страницу, даже при использовании https://www.example.com

request uri: http://www.example.com
secure: no
request uri: http://www.example.com
secure: no
request uri: http://www.example.com
secure: no
request uri: http://www.example.com
secure: no

<снова и снова до страницывремя ожидания>

Ответы [ 3 ]

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

изменить Это

APP_USE_HTTPS=true
APP_URL=https://www.example.com

на это

APP_URL=http://www.example.com
APP_USE_HTTPS=false

Поскольку Laravel использует APP_URL для генерации URL.

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

После долгих исследований я наконец обнаружил, в чем проблема.Мой действующий сервер установлен на сервере Amazon EC2 , который находится за балансировщиком нагрузки .Балансировщик нагрузки получает запрос (https) и обрабатывает все требования SSL, а затем перенаправляет запрос на мой веб-сайт как http.Чтобы решить эту проблему, мне пришлось установить пакет fideloper / TrustedProxy.Этот пакет позволяет моему сайту доверять прокси-серверу и получать действительные заголовки для запроса, поэтому теперь он знает, что запрос был фактически отправлен с использованием https.

Laravel написал статью, которая точно описывает мое состояние.https://laravel -news.com / доверенный-прокси

Это пакет, который я установил: https://github.com/fideloper/TrustedProxy

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

измените ваш config/session.php

'http_only' => true,

измените его на

'http_only' => false,

или создайте промежуточный файл HttpsProtocol.php

namespace MyApp\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
        if (!$request->secure() && App::environment() === 'production') 
        {
             return redirect()->secure($request->getRequestUri());
        }
        return $next($request); 
    }
}

Затем примените этопромежуточное программное обеспечение для каждого запроса, добавляя установку правила в файле Kernel.php в protected $routeMiddleware array,

'https'=>App\Http\Middleware\HttpsProtocol::class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...