¿Cómo configuro SSL con Laravel 5 detrás de un equilibrador de carga (ssl_termination)?

Tengo un proyecto laravel 5 implementado en las instancias web AWS EC2, detrás de un ELB con terminación ssl.

Para cosas como activos, Laravel usa por defecto cualquier esquema que se use actualmente. Sin embargo, me he dado cuenta de que dado que el tráfico de https es descifrado por el ELB y reenviado a los nodos de EC2 a través de http, Laravel no cree que esté utilizando https y, por lo tanto, usa http para los activos. Esto obviamente está causando problemas.

Por lo que he encontrado, Laravel busca este tipo de configuración de proxy usando el encabezado X_FORWARDED_PROTO. Sin embargo, he encontrado que este encabezado no existe y, en su lugar, hay un encabezado HTTP_X_FORWARDED_PROTO. Al investigar esto , descubrí que anteponer “HTTP_” es algo que php hace. Si eso es cierto, ¿por qué no está Laravel comprobándolo, ya que es un framework puramente php?

He leído artículos que dicen usar algo como los servidores proxy de confianza de Fideloper , pero no está claro por qué Laravel no busca estos encabezados de forma predeterminada.

¿Cómo puedo configurar Laravel para aceptar encabezados HTTP_X_FORWARDED_ *, o configurarlo para saber que mi esquema actual es https?

Laravel no los comprueba de forma predeterminada porque estos encabezados se pueden inyectar trivialmente en una solicitud (es decir, falso) y eso crea un vector de ataque teórico en la aplicación. Un usuario malintencionado puede hacer que Laravel piense que una solicitud es, o no es segura, lo que a su vez puede llevar a que algo se vea comprometido.

Cuando me encontré con este mismo problema hace unos meses usando Laravel 4.2, mi solución fue crear una clase de solicitud personalizada y decirle a Laravel que la usara.

#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'); 

y luego en MyCustomReuqestClass , MyCustomReuqestClass la clase de solicitud base y agregué una 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(); } } 

Yo no haría esto ahora . Después de trabajar con el framework durante unos meses, me di cuenta de que la clase de solicitud de Laravel tiene la clase de solicitud de Symfony como padre, lo que significa que una solicitud de Laravel hereda el comportamiento de un objeto de solicitud de Symfony.

Eso significa que puede decirle a Laravel qué servidores proxy debe confiar con algo como esto

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

Este código le dice a Laravel qué servidores proxy debería confiar. Después de eso, debería recoger los encabezados estándar “enviados para”. Puede leer más sobre esta funcionalidad en los documentos de Symfony .