2015-02-13 5 views
3

Наш сайт размещен на сервере с балансировкой нагрузки. Разгрузка SSL выполняется на брандмауэре, поэтому клиент обращается к ферме веб-сервера.Laravel configurate force https

Когда запрос HTTPS достигает наше приложение Laravel, переменная HTTPS сервера пуста и Laravel не кажется, для определения режима HTTPS и генерирует URLs (активы & маршрутов), как:

Есть ли способ настроить Laravel, чтобы заставить url генерировать ссылки https? Мы предпочитаем иметь конфигурационное решение, потому что у нас есть среда разработки и промежуточного уровня, которые не работают под https.

Примечание: Мы уже пробовали подход «trustedproxy» от fideloper, и это не приводило к изменениям. Я предполагаю, что переписывание .htaccess не является опцией, так как перезаписи htaccess основаны на том же заголовке https (мы не получаем) или на порт (порт 44, larvel вызывает порт 443).

Спасибо за помощь.

ответ

2

Класс Laravel UrlGenerator имеет метод, называемый forceSchema, что позволяет принудительно использовать схему и игнорировать ее, извлеченную из URL-адреса запроса. Просто создать поставщик SecureRoutingServiceProvider службы, которая использует МОК 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).

+1

Есть ли причина, по которой вы распространяете UrlGenerator, а не просто возвращаете экземпляр, который вы вызвали forceSchema из-за замыкания, которое вы передали в 'App :: bind()'? –

+1

@JohnM. Отличная точка, в этом случае нет реальной причины для дополнительного класса. Наверное, я просто переусердствовал, когда отвечал на вопрос :). Я обновил ответ с помощью более простого решения, потому что в этом случае имеет смысл. – Bogdan

+0

Ненависть к протесту снова, но по какой-либо причине не просто вызвать 'App :: make ('Illuminate \ Routing \ UrlGenerator')'? :) Я думаю, вам может понадобиться инструкция использования с вашим текущим примером. –

0

Работа над той же проблемой с Laravel 5 Pagination Feature. Для этого его недостаточно, чтобы просто заставить URL-схему в генераторе, потому что она использует URL-адрес, связанный с запросом. После рытья я нашел хорошее исправление.

Illuminate\Http\Request имеет доверенный массив Proxies, который в основном предназначен для этого случая.

Я по-прежнему использовал SecureRoutingServiceProvider от Богдана в качестве отправной точки для белого баланса нашей балансировки нагрузки.

public function boot() 
{ 
    Request::setTrustedProxies(['10.0.0.X']); // Here should be your internal LB IP 

    parent::boot(); 
} 

После этого все получилось очень хорошо. Конечно, вы должны поместить IP в файл config/env.