La Lanterne Rouge

Warning: Geek Inside

[Magento] Réécritures de 404 par regexp

- Posted in Sans catégorie by

En ce moment au boulot je n'ai pas le temps que je voudrais pour coder des modules sur la plateforme Magento (qui me permet de consommer de la nourriture et du matos informatique depuis quatre ans). J'ai donc décidé de me mettre "à mon compte" et de développer sur mon temps libre. Qui sait ? cela pourra peut-être intéresser des gens... (et des recruteurs ^^)

[Magento] Réécritures de 404 par regexp

Le petit module dont je viens de terminer la première version tire son idée de besoins récurrents chez les clients de la société dans laquelle je travaille. Il arrive en effet fréquemment de devoir gérer des redirections d'URL en masse, par exemple suite à la restructuration du catalogue, ou suite simplement à la migration d'une boutique en ligne vers Magento.

Un exemple simple : la navigation par couches (ou "à facettes") générait sur l'ancienne plateforme d'un client des URL de cette forme :

http://www.boutique.com/categorieA-valeur1-valeur2.html

dont l'équivalence dans Magento après migration aurait pu donner ceci :

http://www.boutique.com/categorieA.html?filtre1=valeur1&filtre2=valeur2

Je simplifie volontairement, car il y avait en réalité une dizaine de valeurs en suffixe (!), toutes toujours présentes même si elles étaient vides (elles avaient alors la valeur "0").

Dans un pareil cas, le client ne souhaite pas forcément rediriger chaque URL vers son équivalent exact, mais simplement vers la catégorie correspondante afin de conserver au maximum le référencement. Parfois, une simple redirection permanente vers la (nouvelle) page d'accueil sera même suffisant. Essayer de retrouver toutes les URLs (donc toutes les combinaisons de valeurs !) par crawling ou autre n'est de toute manière clairement pas gérable.

Une fois la migration terminée, et si on n'y prend pas garde, on se retrouve rapidement dans Google Webmaster Tools à devoir gérer des dizaines, des centaines, voire des milliers d'URL en erreur, tout simplement parce qu'on n'a pas (suffisamment) géré la transition. Dans le cas dont je parle, nous avions quand même anticipé la réécriture de plusieurs centaines de milliers d'URL, mais cela n'a pas suffit.

En outre, utiliser le système intégré de réécritures ("url rewrite", ce qui correspond à la table core_url_rewrite) est souvent pénalisant au niveau des performances quand on est dans des ordres de grandeur de dizaines de milliers d'enregistrements.

J'ai donc pensé qu'une solution élégante pour résoudre ce problème, avant ou après la transition, était de poser un hook au niveau du rendu de la page 404 de Magento, c'est-à-dire au moment où Magento va nous renvoyer la page CMS "Cette page n'existe pas gnagnagna".

À ce moment, et sans trop altérer le workflow de la plateforme, il nous suffit de consulter une table contenant des règles de redirections, et grâce à la fonction REGEXP de MySQL on peut éventuellement renvoyer une notification de redirection permanente au visiteur (et surtout au moteur de recherche !) afin qu'il aille tout seul à la nouvelle URL la prochaine fois pour obtenir la ressource demandée.

Dans l'exemple plus haut, il suffit de créer une règle avec le pattern suivant :

^/categorieA-.*\.html

et de définir le chemin cible suivant :

categorieA.html

pour rediriger simplement les visiteurs utilisant les anciennes URL vers la nouvelle catégorie.

On peut aussi à la place utiliser le chemin "système" afin de ne pas être dépendant des url-keys (la catégorie aurait l'ID 10) :

catalog/category/view/id/10

Chaque règle est associée à une boutique (store), possède un option de redirection (aucune, temporaire, permanente), et peut-être activée ou non.

Bien sûr, il s'agit d'un fonctionnement de fallback, et doit être utilisé comme tel. Il ne remplace pas le système de réécritures d'URL de Magento, ni les fonctionnalités de réécritures offertes par Apache (via .htaccess et vhost). Il vient uniquement en complément, et permet surtout à l'administrateur de gérer ses redirections lui-même depuis le back-office, d'en ajouter, d'en modifier, et d'en supprimer si besoin.

Il est nécessaire de savoir un peu ce qu'est une expression rationnelle, mais avec une petite documentation et un peu de support, même les plus hermétiques à la technique peuvent s'y mettre :)

[Magento] Réécritures de 404 par regexp

Le GitHub du module est disponible ici :

https://github.com/nanawel/Arrakis_404EverGone

En cas de bug ou problème, un petit ticket et j'y jetterai un oeil :)

Quelques captures d'écran de l'interface d'administration disponible dans le back-office ci-dessous.

Note : la traduction française est disponible, et sans fautes, ce qui est quand même à mentionner quand on connaît l'état du pack de traductions FR de Magento...

[Magento] Réécritures de 404 par regexp

[Magento] Réécritures de 404 par regexp[Magento] Réécritures de 404 par regexp

[Magento] Réécritures de 404 par regexp

Télécharger l'archive du dépôt :

https://github.com/nanawel/Arrakis_404EverGone/archive/master.zip