Symfony2 derrière ELB redirige vers http au lieu de https
Question:
- Utilisateur se connecte avec https://example.com/login
- authentification approuvée
- tel que configuré en sécurité.YML Symfony2 redirige l'utilisateur vers la page de profil après l'ouverture de session.
- Mais il les redirige vers l'url erronée http://example.com/homepage
sécurité.yml:
security:
encoders:
FOSUserBundleModelUserInterface: 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
Environnement Architecture:
Le Server1 et Server2 contient L'application Symfony2.
Question:
comment forcer Symfony à générer une URL de redirection avec le protocole https à la place de http?
<!-Jusqu'à présent j'ai regardé ces docs, et la solution n'a pas fonctionné dans mon cas:
- http://symfony.com/doc/current/cookbook/routing/scheme.html
7 réponses
regardez
vendeur/symfony/symfony/src/Symfony/Component/HttpFoundation / Request.php
AWS ELB utilise HTTP_X_FORWARDED_PROTO et HTTP_X_FORWARDED_PORT alors que Symfony regarde les en-têtes X_FORWARDED_PROTO et X_FORWARDED_PORT pour juger la connexion et son statut sécurisé.
Vous pouvez essayer de changer ces touches dans les machines à sous, bien que je ne recommande pas de les changer directement, mais de trouver un moyen de les remplacer.
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',
);
- assurez-vous que
trusted_hosts
ettrusted_proxies
les propriétés de configuration sont définies de manière appropriée. - assurez-vous que votre équilibreur de charge ajoute
X-Forwarded-For
,X-Forwarded-Host
,X-Forwarded-Port
et, ce qui est le plus important,X-Forwarded-Proto
en-têtes de la requête HTTP Envoyer à l'application.
Documentation: Faire Confiance Aux Mandataires.
EDIT:
comme @A23 l'a suggéré, vous devriez également vérifier si ELB utilise des noms d'en-têtes "standard". Si non, les modifier à l'aide de l'un des éléments suivants:
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');
j'ai eu exactement le même problème avec une application PHP utilisant AWS et ELB avec SSL dans une application CakePHP.
ma solution était bonne à certains égards et mauvaise à d'autres. Le problème est Qu'Amazon envoie des en-têtes HTTPS différents des en-têtes PHP que vous recherchez: $_SERVER['HTTPS']
est désactivé, alors Qu'Amazon envoie des en-têtes HTTPS alternatifs que vous pouvez utiliser pour identifier qu'il fonctionne en fait sous HTTPS:
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'
j'ai calculé que ma constante D'URL de base définie par Cake l'interne a l' http
protocole, donc j'ai simplement redéfini le index.php le fichier dans un Gâteau et je ne serais pas surpris si vous pouviez faire la même chose dans symfony):
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
cela a permis à mon application de continuer sur, de détecter HTTPS comme étant " on " comme on s'y attendrait normalement et de permettre à Cake de gérer en interne le protocole dans ma constante D'URL de base.
Bon:
- correction du problème immédiatement
- utilisé 3 lignes de code
Mauvais:
- chaque fois que je mets à jour mon coeur de gâteau, je vais devoir le remettre en place
comment forcer Symfony à générer une URL de redirection avec le protocole https à la place de http?
vous devez configurer explicitement le protocole HTTPS parce que par détection seule, Symfony2 ne suppose que HTTP car HTTP est utilisé comme protocole de transport à l'application.
donc pour le composant qui crée L'URI de redirection, vous devez injecter L'URI de base HTTPS-Scheme. Une façon simple de le faire, est de configurer L'URI de base comme paramètre et puis dans la configuration.
exemples de codes donnés
utilisez-vous l'url absolue pour la redirection? je faisais face à un problème similaire derrière myracloud lorsque nous avons utilisé des urls relatives sur la redirection. myracloud "fixe" et absolue, mais a perdu le protocole.
j'ai résolu ce genre de problème dans mon .htaccess, il a l'inconvénient qu'il redirige toujours vers https aussi pas derrière un pare-feu S2, ce qui est ok dans mon cas puisque je n'ai que le formulaire de connexion disponible publiquement et je veux que les informations d'identification soient envoyées via https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{SERVER_NAME}/ [redirect=permanent,last]
les solutions ci-dessus n'ont pas fonctionné pour moi. J'ai ajouté la ligne de code suivante (comme suggéré dans les docs 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) to my web/app.php
:
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
juste après
$request = Request::createFromGlobals();
cela a résolu le problème pour moi dans Symfony 2.5.