Beaucoup de gens sont encore habitués à ce qu'un site web commence par www. mais ce n'est plus le cas. Cela a créé quelques problèmes dans le passé où j'ai déployé un site à https://my-site.org mais ensuite quand les gens essayaient de partager le site, ils le mentionnaient comme https://www.my-site.org.

Rendre le site disponible sur les deux !

J'ai donc commencé à chercher comment rendre le site disponible sur ces deux URLs. La première chose qui m'est venue à l'esprit était de modifier les étiquettes Traefik attachées au conteneur Docker qui sert le site.

# docker-compose.yaml
version : '3.7'
services :
  nginx :
    ...
    labels :
      - "traefik.enable=true"
      - "traefik.http.routers.my-site.rule=Host(`my-site.org`) || Host(`www.my-site.org`)"

Cela fonctionne et le site devient disponible sur les deux URLs, super tout est fait, il est temps d'aller au lit ...

Duplication

Le problème est que les robots d'exploration des sites considèrent que les données du site sont dupliquées et ils n'aiment vraiment pas ça. Pour éviter que cela ne se produise, nous devons nous assurer que toute personne ou tout objet essayant d'aller sur une page commençant par www. soit automatiquement et définitivement redirigé vers la page sans ce sous-domaine.

J'ai commencé par faire tourner une petite instance de nGinx dans un autre conteneur étiqueté avec le préfixe www. qui renverrait un 301 vers le site actuel. C'était un peu compliqué et cela commençait à devenir ennuyeux à faire pour chaque site.

En fonction de l'hôte auquel le site est enregistré, je pouvais parfois ajouter une redirection aux paramètres DNS, mais pas toujours, et cela demandait toujours beaucoup de clics.

Heureusement, en lisant les mises à jour de Traefik, j'ai trouvé quelque chose.

Les middlewares de redirection Traefik

Je suis tombé sur le RedirectRegex middleware section of the documentation. Il indique que si la requête entrante correspond à une regex, nous remplaçons l'url de la requête. Je me suis donc dit que j'allais tenter le coup pour me débarrasser du sous-domaine www.

Il existe de nombreuses façons d'ajouter des middlewares à votre configuration Traefik, mais comme celui-ci sera de plus en plus souvent requis, je ne voulais pas ajouter beaucoup d'étiquettes supplémentaires à chaque conteneur Docker. J'ai fini par l'ajouter à mon fichier dynamic_conf.yaml.

 http :
   middlewares :
     redirect-www :
       redirectRegex :
         regex : "^https?://www\\.(.+)"
         replacement : "https://${1}"
         permanent : true

Et voilà ! Tout ce qui commence par http://www. ou https://www. sera redirigé de façon permanente vers https://.

http://www.my-site.org => https://my-site.org

Donc maintenant, si je veux qu'un de mes conteneurs utilise ce middleware, je dois ajouter une autre étiquette :

    labels :
      - "traefik.enable=true"
      - "traefik.http.routers.my-site.rule=Host(`my-site.org`) || Host(`www.my-site.org`)"
      - "traefik.http.routeurs.mon-site.middlewares=redirect-www@file"

Updates

  • 17/03/2021 : Update le regex de ^https?://www.(.*) à ^https?://www\\.(.+) grâce aux commentaires de Navossoc