Мой сервер использует 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
<снова и снова до страницывремя ожидания>