Question Symfony2 derrière ELB est redirigé vers http au lieu de https


Problème:

  • L'utilisateur se connecte avec https://example.com/login
  • L'authentification est approuvée
  • Comme configuré dans security.yml, Symfony2 redirige l'utilisateur vers la page de profil après la connexion.
  • Mais il les redirige vers la mauvaise URL http://example.com/homepage

security.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

Architecture de l'environnement:

enter image description here

Server1 et Server2 contiennent l'application Symfony2.

Question:

Comment forcer Symfony à générer une URL de redirection avec le protocole https au lieu de http?

Jusqu'à présent, j'ai examiné ces documents et la solution n'a pas fonctionné dans mon cas:


25
2018-05-13 00:33


origine


Réponses:


Jeter un coup d'œil à

vendeur / symfony / symfony / src / symfony / composant / httpfoundation / request.php

AWS ELB utilise HTTP_X_FORWARDED_PROTO et HTTP_X_FORWARDED_PORT tandis que Symfony recherche les en-têtes X_FORWARDED_PROTO et X_FORWARDED_PORT pour évaluer la connexion et son statut sécurisé.

Vous pouvez essayer de changer ces clés dans les TrustedHeaders bien que je ne recommande pas de les modifier 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
2018-05-19 09:05



  1. Sois sûr 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, le plus important, X-Forwarded-Proto en-têtes à la requête HTTP envoyer à l'application.

Documentation: Des procurations fiables.


MODIFIER:

Comme @ A23 l'a suggéré, vous devriez également vérifier si ELB utilise des noms d'en-têtes "standard". Sinon, changez-les en utilisant l'un des 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
2018-05-15 11:27



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 dans d'autres. Le problème était que 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 s'exécute en réalité sous HTTPS:

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

J'ai constaté que mon URL de base constante que Cake définissait en interne avait le http protocole, donc j'ai simplement redéfini le $_SERVER['HTTPS'] variable sur la toute première ligne de mon index.php fichier dans Cake - 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, de détecter HTTPS comme étant normalement activé et de permettre à Cake de gérer en interne le protocole dans la constante URL de ma base.

Bien:

  • corrigé le problème immédiatement
  • utilisé 3 lignes de code

Mal:

  • chaque fois que je mets à niveau mon coeur de gâteau, je devrai le remettre en place

2
2018-05-21 04:03



Comment forcer Symfony à générer une URL de redirection avec le protocole https au lieu de http?

Vous devez configurer explicitement le protocole HTTPS car, par la détection seule, Symfony2 ne devinera 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 le schéma URI de base HTTPS. Un moyen simple de le faire consiste à configurer l'URI de base en tant que paramètre, puis dans la configuration.

Des codes d'exemple sont donnés


0
2018-05-18 15:36



utilisez-vous une URL absolue pour la redirection? Je faisais face à un problème similaire derrière myracloud lorsque nous avons utilisé des URL relatives lors de la redirection. myracloud l'a "corrigé" et l'a rendu absolu, mais a perdu le protocole.


0
2018-05-22 10:24



J'ai résolu ce genre de problème dans mon fichier .htaccess, mais il a l'inconvénient de rediriger toujours vers https et non derrière un pare-feu S2, ce qui est correct dans mon cas puisque je n'ai que le formulaire de connexion disponible et que je souhaite être envoyé via https

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

0
2018-05-22 10:36



Les solutions ci-dessus n'ont pas fonctionné pour moi. J'ai ajouté la ligne de code suivante (comme suggéré dans les documents 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) à mon 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
2018-03-01 12:37