route php .htaccess symfony redirect amazon-elb

php - route - symfony routing



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

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

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

Entonces, para el componente que crea el URI de redireccionamiento, necesita inyectar el esquema URI base HTTPS. Una forma sencilla de hacer esto, es configurar el URI base como un parámetro y luego dentro de la configuración.

Se dan códigos de ejemplo

Problema:

  • El usuario inicia sesión con https://example.com/login
  • La autenticacion esta aprobada
  • Según lo configurado en security.yml, Symfony2 redirige al usuario a la página de perfil después de iniciar sesión.
  • Pero los redirige a la url incorrecta http://example.com/homepage

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:

El Servidor1 y el Servidor2 tienen la aplicación Symfony2.

Pregunta:

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

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


  1. Asegúrese de que las propiedades de configuración trusted_hosts y trusted_proxies estén configuradas correctamente.
  2. Asegúrese de que su equilibrador de carga agregue X-Forwarded-For , X-Forwarded-Host , X-Forwarded-Port y, lo que es más importante, encabezados de X-Forwarded-Proto a la solicitud HTTP que se envía a la aplicación.

Documentación: Confiando en los proxies .

EDITAR:

Como @ A23 sugirió, también debe verificar si ELB está usando nombres de encabezados "estándar". Si no, cámbielas usando una de las 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'');


¿Utiliza la URL absoluta para la redirección? Me enfrenté 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.


Echa un vistazo a

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

AWS ELB utiliza HTTP_X_FORWARDED_PROTO y HTTP_X_FORWARDED_PORT mientras que Symfony busca los encabezados X_FORWARDED_PROTO y X_FORWARDED_PORT para juzgar la conexión y su estado de seguridad.

Puede intentar cambiar esas claves en los Headers de confianza, aunque no recomendaría cambiarlas directamente, sino encontrar una forma de anularlas.

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


He resuelto este tipo de problema en mi .htaccess, tiene el inconveniente de que siempre redirige a https, no detrás de un firewall S2, lo cual está bien en mi caso, ya que solo tengo el formulario de inicio de sesión disponible públicamente y deseo que las credenciales ser enviado a través de https

RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{SERVER_NAME}/$1 [redirect=permanent,last]



Tuve exactamente el mismo problema con una aplicación PHP que utiliza 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 diferentes encabezados HTTPS a los encabezados de PHP que busca: $_SERVER[''HTTPS''] está desactivado, mientras que Amazon envía encabezados HTTPS alternativos que puede usar para identificar que se está ejecutando bajo HTTPS:

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

Descubrí que mi constante de URL básica que Cake definía internamente tenía el protocolo http , así que simplemente redefiní la variable $_SERVER[''HTTPS''] en la primera línea de mi archivo index.php en Cake, y no lo haría '' No te sorprendas 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ó que mi aplicación continuara, detecte el HTTPS como "activado" como se esperaría normalmente y permitir que Cake administre internamente el protocolo en mi constante de URL base.

Bueno:

  • arreglado el problema inmediatamente
  • usé 3 líneas de código

Malo:

  • cada vez que actualice mi núcleo de Cake, tendré que volver a poner esto