Lerm-IT

Blog traitant de technologies informatiques. Logiciel libre, AdminSys, DevOps et GNU/Linux !

18 Apr 2020

[Hugo] Redirections 301

Problématique

Faire des redirections

Pour faire une redirection il est possible d’ajouter dans les metadata de nos articles l’option aliases 1

---
title: "HUGO Redirections 301"
date: 2020:04:15T13:26:21Z
aliases: ["/url/d/origine/"]

Ainsi un appel à la page /url/d/origine/ nous servira une page de redirection.

$ curl localhost:1313/url/d/origine/
...
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Length: 430
< Content-Type: text/html; charset=utf-8
< Last-Modified: Wed, 15 Apr 2020 13:29:02 GMT
< Date: Wed, 15 Apr 2020 13:29:36 GMT

<!DOCTYPE html>
<html>
  <head>
    <title>http://localhost:1313/posts/2014/04/hugo-redirections-301/</title>
    <link rel="canonical" href="http://localhost:1313/posts/2014/hugo-redirections-301/"/>
    <meta name="robots" content="noindex">
    <meta charset="utf-8" />
    <meta http-equiv="refresh" content="0; url=http://localhost:1313/posts/2014/04/hugo-redirections-301/" />
  </head>
</html>

L’option aliases étant un tableau il est possible d’ajouter plusieurs URL

D’un point de vue SEO

Si cette méthode est fonctionnelle, d’un point de vue SEO elle n’est pas optimale. En effet notre page de redirection nous sert un contenu HTML avec un code de retour 200. Ce qui signifie d’un point que la page a été correctement chargée. Ceci n’est pas tout à fait vrai.

Il existe plusieurs codes de retour HTTP pour les redirections qui sont classées dans le groupe 3XX2. Google, Bing et consort donne de meilleurs notes aux sites qui appliquent des redirections de type 3XX quand une ressource n’est plus disponible.

Comme Hugo se contente de générer des pages web et n’est pas responsable du service de celle-ci (la commande hugo serve n'étant utile qu'à des fins de tests) il va être nécessaire de configurer un vrai serveur HTTP. Nous utiliserons ici le serveur Nginx.

Contrairement à ce que j’ai pu croire 3 hugo est capable de générer n’importe quel type de fichier, y compris des fichiers de configuration. Pour réaliser ceci il est nécessaire de déclarer un nouveau format de génération de fichier (ici se sera conf/nginx) et de créer un template 4. Commençons par éditer notre fichier config.toml pour déclarer notre nous format.

[outputs]
  home = [ "HTML", "RSS", "REDIR"]

[mediaTypes]
[mediaTypes."conf/nginx"]

[outputFormats]
[outputFormats.REDIR]
  mediatype = "conf/nginx"
  path = "nginx-config"
  baseName = "redirections.conf"
  isPlainText = true
  notAlternative = true

La première partie du fichier nous permet de définir la liste des formats de fichier que doit générer Hugo pour la page d’accueil. Ici nous générons cette page en HTML standard, comme flux RSS mais aussi avec le format REDIR que nous créons actuellement.

Ensuite vient la définition d’un nouveau type de fichier. Nous créons simplement un mediaType nommé conf/nginx et enfin la définition qui nous intéresse: le format de sortie.

Nous définissons ici que ce format sera de sortie sera utilisé pour le type de fichier conf/nginx. Le fichier résultant (redirections.conf) sera stocké dans le répertoire nginx-config au format texte brute (donc sans modification des parsers HTML de Hugo). Enfin la dernière option notAlternative permet de dire à Hugo que ce format ne doit pas être proposé comme format de consultation standard (contrairement au HTML par exemple).

Il nous reste maintenant à créer le template. Créer le fichier layout/index.redir dans votre thème ou dans votre projet avec ce contenu.

# Nginx redirect
{{  range $p := .Site.Pages -}}
{{ range .Aliases }}
rewrite ^{{  . }}$ {{ $p.RelPermalink }} permanent;
{{ end -}}
{{- end -}}

Ce thème va itérer sur l’ensemble des aliases des pages et ajouter une ligne de configuration nginx traitant la redirection. Vous pourrez ensuite inclure de fichier dans votre configuration nginx via un simple include.

server {
    listen       80;

    ...

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        include /path/to/nginx-config/redirections.conf;
    }

Si vous recharger nginx vos redirections seront maintenant prisent en comptes.

Sécuriser l’accès au fichier redirection.conf

Il subsiste néanmoins un problème : le fichier redirection.conf est accessible directement dans un navigateur. Si vous vous rendez sur l’URL http://monsite.tld/nginx-config/redirection.conf vous pouvez le constater.

Nous allons ajouter ces quelques lignes au début de notre fichier de configuration nginx pour éviter de divulguer trop d’informations sur notre site.

location /nginx-config/ {
  deny all;
}

Ainsi le fichier de configuration généré demandera à nginx d’interdire l’accès à tous les fichiers dans le dossier /nginx-config/.

Conclusion

Nos redirections 301 sont maintenant plus propre, nos spécialistes SEO en seront que plus content!


  1. Documentation de l’option aliases ↩︎

  2. RFC HTTP, Les codes 3XX ↩︎

  3. 2 heures de perdues à réinventer la roue ↩︎

  4. Les formats de sortie personnalisés ↩︎