Наш сайт размещен на сервере с балансировкой нагрузки. Разгрузка SSL выполняется на брандмауэре, поэтому клиент обращается к ферме веб-сервера.
Когда запрос https достигает нашего приложения Laravel, переменная сервера HTTPS пуста, и Laravel, похоже, не обнаруживает https-режим и генерирует URL-адреса (активы и маршруты) как:
Есть ли способ настроить Laravel, чтобы заставить url генерировать ссылки https? Мы предпочитаем иметь конфигурационное решение, потому что у нас есть среда разработки и промежуточного уровня, которые не работают под https.
Примечание. Мы уже пробовали подход «trustedproxy» от fideloper, и это не приводило к изменениям. Я предполагаю, что переписывание .htaccess не является опцией, так как перезаписи htaccess основаны на том же заголовке https (мы не получаем) или на порт (порт 44, larvel вызывает порт 443).
Спасибо за помощь.
Класс UrlGenerator
класса Laravel имеет метод forceSchema
, который позволяет принудительно использовать схему и игнорировать ее, извлеченную из URL-адреса запроса. Просто создайте поставщика услуг SecureRoutingServiceProvider
который использует IOC Laravel для переопределения генератора по умолчанию и возврата экземпляра, который заставляет безопасную схему:
use Illuminate\Routing\UrlGenerator; use Illuminate\Routing\RoutingServiceProvider; class SecureRoutingServiceProvider extends RoutingServiceProvider { public function boot() { App::bind('url', function () { $generator = new UrlGenerator( App::make('router')->getRoutes(), App::make('request'); }); $generator->forceSchema('https'); return $generator; } parent::boot(); } }
Затем нам нужно будет зарегистрировать поставщика услуг, добавив его в массив providers
в app/config/app.php
:
'providers' => array( ..., 'SecureRoutingServiceProvider', )
И это все, что нужно. Я тестировал этот код, и он отлично работает (в Laravel 4.2).
Работа над той же проблемой с Laravel 5 Pagination Feature. Для этого его недостаточно, чтобы просто заставить URL-схему в генераторе, потому что она использует URL-адрес, связанный с запросом. После рытья я нашел хорошее исправление.
Illuminate\Http\Request
имеет массив trustedProxies, который в основном для этого случая.
Я все еще использовал SecureRoutingServiceProvider
от Богдана в качестве отправной точки для белого списка нашего балансировщика нагрузки.
public function boot() { Request::setTrustedProxies(['10.0.0.X']); // Here should be your internal LB IP parent::boot(); }
После этого все получилось очень хорошо. Конечно, вы должны поместить IP в файл config / env.