Permaliens

Gérer les urls dans les sites générés avec Hugo

Contexte

Les objets composant les sites (pages, posts, persons…) ont une URL, qui est supposée être permanente : le permalien.

Ce permalien, dans Osuny, ne contient pas le domaine ni le protocole, mais juste le path, la partie après le nom de domaine. Il est composé de plusieurs parties, typiquement :

/fr/actualites/2022-10-22-un-article/

soit

/:localisation/:section/:slug/

Ce motif de permalien est l’un des motifs possibles, parmi de nombreux autres.

Malheureusement, ces permaliens pouvent bouger pour plusieurs raisons :

  • activation ou désactivation d’une langue
  • changement de slug (suite à changement de date ou de titre)
  • changement de slug de section
  • changement technique dans le site

À chaque changement, si rien n’est fait techniquement, la précédente URL devient une erreur 404. Il faut éviter cela et créer une redirection 301 (permanente) afin de renvoyer la personne sur le bon permalien.

Pour parvenir à ce résultat, il faut conserver la trace des anciens permaliens. Quand on dispose de cette information, on peut agir de 2 façons :

  • en donnant à Hugo des alias, ce qui lui permet de faire des redirections vers les nouvelles pages
  • en exportant une table de redirection, dont le format dépend du serveur

Inventaire

Les différentes formes utilisées sont :

Forme NomDescription
2022-10-22-un-articleslugIdentifiant d’un objet, sans contexte. Pour les catégories ce slug tient compte de la parentèle (categorie-sous-categorie)
/2022-10-22-un-article/??
/actualites/2022-10-22-un-article/pathslug with ancestors slugs, sans langue
/fr/actualites/2022-10-22-un-article/permalink
/content/posts/2022/2022-10-22-un-article/_index.mdfileChemin physique du fichier

Architecture

Une classe gère globalement les permalinks :

class Communication::Website::Permalink
end

Responsabilité :

  • Configuration Hugo des permalinks
  • current (bool et scope)
  • historique
  • contexte (website)

Un concern Permalinkable qui encapsule le lien (.permalinks, .permalink_in_website)

include Permalinkable

Responsabilité :

  • fournir le permalink actuel
  • fournir les anciens
  • se déclencher à la synchronisation (afin de gérer la cascade de dépendances en utilisant celle de la sync plutôt que de la répliquer)
  • faire le lien avec les objets par type

Des objets par type :

class Communication::Website::Permalink::Page
end

Responsabilité :

  • calcul du permalink
  • fonctionnements spécifiques par type d’objet

Objets directs

Page

Post

Objets indirects

Program

Le cas de l’arbre des formations et de l’arbre de la page Offre de formation

Fil d’ariane

En anglais, breadcrumbs.