Problème de HTTPS avec Symfony

Corrgier un problème de HTTPS et comment configurer Symfony à travers un load balancer ou un reverse proxy.

Jérémy 🤘
Jérémy 🤘

Je suis en train de développer une application Symfony et je me suis heurté à un problème assez obscur.

En local mon site tourne en HTTP mais en production il tourne avec du HTTPS et la génération des routes dans mes controllers et dans mes vues n'étaient pas en HTTPS alors que l'utilisateur lui navigue bien en HTTPS. En temps normal, Symfony génère les routes par rapport au protocole actuel de l'utilisateur.

Le soucis vient du fait qu'en production, pour gérer mon certificat SSL je passe par un reverse proxy Docker grâce à evertramos qui se gère de renvoyer les différentes URLs vers les bons conteneurs Docker et aussi de générer/renouveler mes certificats SSL Let's Encrypt.

Le fait de passer par là pose un problème au niveau des headers qui n'ont plus les informations que Symfony essaye de lire et qui sont stockés dans X-Forwarded-*. Par exemple si vous souhaitez avoir l'adresse IP d'un visiteur, vous ne pourrez pas la retrouver grâce à REMOTE_ADDR qui va retourner l'adresse IP de votre conteneur proxy mais en lisant le header Forwarded: for="..." ou X-Forwarded-For. Et Symfony se base justement sur les headers pour savoir si l'utilisateur navigue en HTTPS ou non.

La solution est donc de donner l'adresse IP du reverse proxy grâce à la variable d'environnement TRUSTED_PROXIES.

Si vous êtes un barbare vous pouvez mettre 0.0.0.0 mais si vous connaissez l'adresse IP de votre proxy, vous pouvez mettre son IP. Vous pouvez aussi mettre une plage d'IP si par exemple vous en avez plusieurs mais sous le même masque. Voici quelques exemples de plages IP :

  • Docker : 172.16.0.0/12
  • Réseau local : 192.168.0.0/16 ou 10.0.0.0/8