Symfony2 detrás de ELB está redirigiendo a http en lugar de https


Asunto:

Seguridad.yml :

security:

    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        main:
            pattern:    ^/
            form_login:
                check_path: /login_check
                login_path: /login
                default_target_path: /profile
                provider: fos_userbundle
            logout:
                path:   /logout
                target: /splash
            anonymous: ~

    access_control:
        - { roles: ROLE_USER, requires_channel: https }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

    acl:
        connection: default

Arquitectura del entorno:

introduzca la descripción de la imagen aquí

El Servidor 1 y el servidor 2 tienen Symfony2 aplicación.

Pregunta:

¿Cómo forzar a Symfony a generar URL de redirección con protocolo https en lugar de http?

Hasta ahora he mirado estos documentos, y la solución no funcionó trabajo en mi caso:

Author: TeaCupApp, 2014-05-13

7 answers

Echa un vistazo a

Vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Request.php

AWS ELB usa HTTP_X_FORWARDED_PROTO y HTTP_X_FORWARDED_PORT mientras Symfony busca las cabeceras X_FORWARDED_PROTO y X_FORWARDED_PORT para juzgar la conexión y su estado seguro.

Puede intentar cambiar esas claves en los trustedHeaders, aunque no recomendaría cambiarlas directamente, sino encontrar una manera de sobrescribirlas.

protected static $trustedHeaders = array(
        self::HEADER_CLIENT_IP    => 'X_FORWARDED_FOR',
        self::HEADER_CLIENT_HOST  => 'X_FORWARDED_HOST',
        self::HEADER_CLIENT_PROTO => 'HTTP_X_FORWARDED_PROTO',
        self::HEADER_CLIENT_PORT  => 'HTTP_X_FORWARDED_PORT',
    );

Referencia - http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

 20
Author: A23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 03:48:20
  1. Asegúrese de que las propiedades de configuración de trusted_hosts y trusted_proxies estén correctamente definidas.
  2. Asegúrese de que su balanceador de carga agrega X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Port y, lo más importante, X-Forwarded-Proto los encabezados de la solicitud HTTP se envían a la aplicación.

Documentación: Confiar en Proxies.


EDITAR:

Como @A23 sugirió, también debería verificar si ELB está usando nombres de encabezados "estándar". Si no, cámbielos usando uno de los siguientes:

Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X-Proxy-For');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X-Proxy-Host');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X-Proxy-Port');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X-Proxy-Proto');
 7
Author: Crozin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 16:41:39

Tuve exactamente el mismo problema con una aplicación PHP usando AWS y ELB con SSL en una aplicación CakePHP.

Mi solución fue buena en algunos aspectos y mala en otros. El problema fue que Amazon envía encabezados HTTPS diferentes a los encabezados PHP que busca: $_SERVER['HTTPS'] está desactivado, mientras que Amazon envía encabezados HTTPS alternativos que puede usar para identificar que de hecho se ejecuta bajo HTTPS:

$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'

Calculé que mi constante de URL base que Cake definió internamente tenía el http protocolo en él, así que simplemente redefiní la variable $_SERVER['HTTPS'] en la primera línea de mi archivo index.php en Cake - y no me sorprendería si pudieras hacer lo mismo en symfony):

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

Esto permitió a mi aplicación continuar, detectar HTTPS como 'on' como normalmente se esperaría y permitir que Cake administrara internamente el protocolo en mi constante de URL base.

Bueno:

  • solucionado el problema inmediatamente
  • utilizó 3 líneas de código

Malo:

  • cada vez que actualice mi núcleo de pastel, tendré que volver a poner esto de nuevo{[18]]}
 2
Author: Robbie Averill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 04:03:12

¿Cómo forzar a Symfony a generar URL de redirección con protocolo https en lugar de http?

Debe configurar explícitamente el protocolo HTTPS porque solo por detección, Symfony2 solo adivinará HTTP ya que HTTP se usa como protocolo de transporte a la aplicación.

Por lo tanto, para el componente que crea el URI de redirección, debe inyectar el esquema URI base HTTPS. Una forma sencilla de hacer esto, es configurar la base-URI como un parámetro y luego dentro de la configuración.

Se dan códigos de ejemplo

 0
Author: hakre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-18 15:36:02

¿Está utilizando url absoluta para la redirección? me enfrentaba a un problema similar detrás de myracloud cuando usamos URL relativas en la redirección. myracloud lo "arregló" y lo hizo absoluto, pero perdió el protocolo.

 0
Author: oliver nadj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 10:24:11

He resuelto este tipo de problema en mi .htaccess, tiene la desventaja de que siempre redirige a https también no detrás de un firewall S2, lo que está bien en mi caso ya que solo tengo el formulario de inicio de sesión disponible públicamente y quiero que las credenciales se envíen a través de https

 RewriteCond %{HTTP:X-Forwarded-Proto} !https
 RewriteRule (.*) https://%{SERVER_NAME}/$1 [redirect=permanent,last]
 0
Author: m0c,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 10:36:59

Las soluciones anteriores no funcionaron para mí. He añadido la siguiente línea de código (como se sugiere en los documentos de Symfony2 http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly) a mi web/app.php:

Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));

Justo después de

$request = Request::createFromGlobals();

Eso resolvió el problema para mí en Symfony 2.5.

 0
Author: totas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-01 12:54:02