Symfony2 detrás de ELB está redirigiendo a http en lugar de https
Asunto:
- El usuario inicia sesión con https://example.com/login
- Se aprueba la autenticación
- Como está configurado en seguridad.yml Symfony2 redirige al usuario a la página de perfil después de iniciar sesión.
- Pero 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 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:
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
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
- Asegúrese de que las propiedades de configuración de
trusted_hosts
ytrusted_proxies
estén correctamente definidas. - 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');
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]]}
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
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.
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]
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.
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