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:

enter image description here

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
25
demandé sur TeaCupApp 2014-05-13 04:33:42

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

Référence - http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#x-forwarded-for

20
répondu A23 2014-05-21 03:48:20
  1. assurez-vous que trusted_hosts et trusted_proxies les propriétés de configuration sont définies de manière appropriée.
  2. 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');
7
répondu Crozin 2014-05-22 16:41:39

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
2
répondu Robbie Averill 2014-05-21 04:03:12

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

0
répondu hakre 2014-05-18 15:36:02

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.

0
répondu oliver nadj 2014-05-22 10:24:11

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]
0
répondu m0c 2014-05-22 10:36:59

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.

0
répondu totas 2015-03-01 12:54:02