Como faço para configurar o SSL com o Laravel 5 atrás de um balanceador de carga (ssl_termination)?

Eu tenho um projeto laravel 5 implantado em instâncias da web do AWS EC2, atrás de um ELB com terminação ssl.

Para coisas como ativos, o Laravel, por padrão, usa qualquer esquema usado atualmente. No entanto, notei que o tráfego https é desencrito pelo ELB e encaminhado para os nós EC2 via http, a Laravel não pensa que está usando https e, portanto, usa http para ativos. Isso está causando problemas.

Pelo que encontrei, o Laravel verifica esse tipo de configuração de proxy usando o header X_FORWARDED_PROTO. No entanto, eu achei que este header não existe e, em vez disso, há um header HTTP_X_FORWARDED_PROTO. Ao pesquisar isso , descobri que o “HTTP_” de prependimento é algo que o php faz. Se isso for verdade, então, por que o Laravel não está procurando por isso, pois é um framework puramente php?

Eu li artigos dizendo usar algo como Proxy de Confiança da Fideloper , mas não está claro por que o Laravel não verifica esses headers por padrão.

Como posso configurar o Laravel para aceitar headers HTTP_X_FORWARDED_ *, ou configurá-lo de outra forma para saber se o meu esquema atual é https?

O Laravel não verifica isso por padrão porque esses headers podem ser injetados trivialmente em uma solicitação (ou seja, falsos), e isso cria um vetor de ataque teórico em sua aplicação. Um usuário mal-intencionado pode fazer com que o Laravel pense que um pedido é ou não é seguro, o que, por sua vez, pode levar a que algo seja comprometido.

Quando encontrei esse mesmo problema alguns meses atrás, usando o Laravel 4.2, minha solução era criar uma class de solicitação personalizada e dizer a Laravel para usá-la

#File: bootstrap/start.php //for custom secure behavior -- laravel autoloader doesn't seem here yet? require_once realpath(__DIR__) . 'path/to/my/MyCustomRequest.php'; Illuminate\Foundation\Application::requestClass('MyCustomRequest'); 

e então em MyCustomReuqestClass , eu estendi a class de solicitação base e adicionei uma lógica extra / is-not secure

 class Request extends \Illuminate\Http\Request { /** * Determine if the request is over HTTPS, or was sent over HTTPS * via the load balancer * * @return bool */ public function secure() { $secure = parent::secure(); //extra custom logic to determine if something is, or is not, secure //... return $secure; } public function isSecure() { return $this->secure(); } } 

Eu não faria isso agora . Depois de trabalhar com a estrutura por alguns meses, percebi que a class de solicitação da Laravel tem a class de solicitação do Symfony como pai, o que significa que uma solicitação Laravel herda o comportamento de um object de pedido do Symfony.

Isso significa que você pode dizer a Laravel quais servidores proxy deve confiar com algo assim

 Request::setTrustedProxies(array( '192.168.1.52' // IP address of your proxy server )); 

Este código diz a Laravel quais servidores proxy ele deve confiar. Depois disso, deve capturar os headers padrão “encaminhados para”. Você pode ler mais sobre essa funcionalidade nos documentos do Symfony .