Cool URIs don’t change, dit Tim Berner Lee, et il a bien raison ; rien ne m’énerve plus que de voir une recherche échouer sur une bête erreur 404, soit parce que son propriétaire en a supprimé le résultat, soit parce qu’il l’a déplacé ailleurs sans faire attention à ceux qui pourraient vouloir y accéder. Malheureusement, les raisons pour lesquelles on doit déplacer une ressource d’un endroit du web à un autre ne manquent pas : changement d’outil de content management, d’URL ou réorganisation du site.

Heureusement, HTTP est pour cela pas trop mal foutu, puisqu’il offre la possibilité de signaler les changements d’adresse aux navigateurs, mais également aux moteurs de recherche, qui peuvent ainsi recomposer la carte de votre site sans jamais perdre leurs petits. Et nous avons notamment :

  • Code de retour HTTP 301 : redirection permanente.
  • Code de retour HTTP 302 : redirection temporaire.

Ce matin, le soleil brille, les petits oiseaux chantent, les amoureux se bécotent sur les bancs publics, et vous, vous avez décidé de simplifier la génération des liens permanents de votre application Rails. Adieu les anciennes URI au format /année/mois/jour/titre-de-la-page, bonjour des URI simples, et appréciées des moteurs de recherche en /titre-de-la-page, tellement plus jolies et appréciées – paraît-il – des moteurs de recherche. C’est Otto qui me l’a dit, et je pense qu’on peut lui faire confiance à ce sujet.

Vous allez pour cela devoir rediriger toutes les anciennes URI vers les nouvelles. Chaque fois qu’un visiteur, navigateur ou moteur de recherche arrivera sur votre site avec l’ancien format, votre application le renverra vers la nouvelle adresse en lui précisant la permanence du changement.

Si vous utilisez Apache, c’est facile, il vous suffit d’utiliser mod_rewrite, et vous y êtes. Mais soyons honnêtes, c’est une horreur à utiliser, surtout pour des changements de masse comme cela, vous avez honnêtement 9 chances sur 10 de tout casser, et vous risquez d’être obligé de traiter un très grand nombre de cas particuliers. Je sais de quoi je parle, il y a encore 2 jours, mon vhost contenait la modique somme de 534 rewrite rules correspondant à deux changements successifs de schémas de liens permanents (retrait des dates, puis des accents). Ce soir, il n’y en a plus qu’une trentaine. Mais le principal problème ne vient pas de là : vous cherchez à faire quelque chose d’universel, or, tout le monde n’a pas la possibilité de générer les règles de réécriture nécessaires à un pareil changement, et Apache est loin d’être universellement utilisé pour les applications Rails. Il vous faut donc impérativement trouver une solution qui soit webserver agnostique.

Et pour cela, une seule solution : profiter des possibilités offertes par Ruby et Rails en termes de routage, afin de remplacer 534 rewrite rules par une demi-douzaine de lignes de Ruby. Nous commençons donc par modifier le fichier config/routes.rb, afin d’y ajouter une nouvelle route. N’oubliez-pas de redémarrer votre application pour que les changements soient pris en compte.

map.connect ':year/:month/:day/:title',
    :controller => 'articles', :action => 'redirector'    

Cette nouvelle route va s’appliquer chaque fois qu’un visiteur tentera d’accéder à une URI de la forme /année/mois/jour/titre-de-la-page, en exécutant la méthode redirector du contrôleur articles.

def redirector
  headers["Status"] = "301 Moved Permanently"
  redirect_to this_blog.base_url + params[:title]
end

Notre méthode redirector va renvoyer un code HTTP 301 avec le message “parti définitivement”, puis renvoyer bien poliment le visiteur vers la nouvelle URI. Dans notre cas précis, l’URL du site suivie du titre du billet passée en paramètre.

Cette méthode présente de nombreux avantages : elle permet de s’affranchir des contraintes liées à l’utilisation de tel ou tel serveur web, ainsi que de la présence ou non de mod_rewrite. Elle prend ensuite en compte toutes les possibilités imaginable avec l’ancien schémas d’URL sans qu’il soit nécessaire de gérer quelque cas particulier que ce soit. Enfin, elle ne casse pas – et c’est très important – le système d’archivage annuel, mensuel ou quotidien qui prennent respectivement les URI /année, /année/mois et /année/mois/jour, puisque la règle ne s’applique que lorsque tous les paramètres sont présents.

Dans notre prochain billet, nous étudierons l’importance de composer des menus équilibrés pour faciliter le transit de vos visiteurs.

St Joseph et l'enfant Jésus, église saint Eugène / Sainte Cécile à Paris

Perry the Platypus wants you to subscribe now! Even if you don't visit my site on a regular basis, you can get the latest posts delivered to you for free via Email: