Catégories
Apache

RewriteMap : How-To

Aujourd’hui on va parler d’un aspect un peu plus technique de l’url-rewriting : l’utilisation de RewriteMap.
Cette directive avec un nom assez parlant, permet d’établir des correspondances qui pourront etre utilisées dans vos règles de re-écriture (principalement les RewriteRule).
Elle intervient principalement la ou les expressions régulières « basiques » de votre htaccess trouvent leur limite (ATTENTION, nous allons bien sur utiliser des expressions régulières avec RewriteMap).
Avant de vous montrer comment mettre en place cette directive assez peu utilisée, voyons dans quel cas pourra-t-elle nous être (très) utile.

Des milliers de pages en 404, au secours !!!

Vous venez de reprendre l’architecture de votre site de A à Z parce que ça devenait primordial (un nouveau client qui vient de signer chez vous, un ancien site pour lequel il ne faut pas refaire que la facade mais bien revoir de fond en comble l’aménagement intérieur, …).
En bon SEO que vous êtes, vous savez d’ores et déjà ce que cette nouvelle architecture entraînera : une foultitude de redirections !!
Pour cela, chacun a sa méthode :

  1. A l’ancienne tonton, à la mano
  2. En scrapant les SERPs et avec un script bien gaulé, ça génère un beau .htaccess tout frais
  3. Utiliser la méthode précédente couplée à l’établissement d’une correspondance avec votre nouvelle BDD pour n’avoir rien à faire 😉
  4. Appeler Google pour lui demander de le faire à votre place
  5. Prendre une corde avec un noeud coulant, la placer autour de votre cou, et aller voir votre responsable avec un air très dépressif
  6. Autre, chacun sa methode …

Oui mais voila, ces méthodes sont valables sur des sites possédants quelques dizaines voir centaines de pages. Quand on dépasse cette limite, votre fichier .htaccess va vite enfler et quand vous souhaiterez modifier une règle, vous prendrez l’option précédente N°5.
Pour remédier à cela, il y a les RewriteMap.

Concrètement la directive RewriteMap, c’est quoi ?

La directive RewriteMap sert comme indiqué dans l’intro à établir des correspondances pour lesquelles il vous manquera un (ou plusieurs) paramètres dans l’url existante.
En gros, re-écrire une page du style

http://www.example.com/produit1-marque2.html

en

http://www.example.com/marque2/produit1.html

est relativement simple.

Mais comment faire lorsque je souhaite rediriger

http://www.example.com/produit1.html

en

http://www.example.com/marque2/produit1.html

Et cela pour des centaines de pages ?

Je me doute que c’est la partie que vous attendiez tous, donc voici comment nous allons procéder.
Je vais simuler un cas dans lequel on devrait faire appel à cette directive.
Exposition du problème :
Vous venez de reprendre un site e-commerce et vous avez décider de classer tous les produits au sein de leurs marques respectives (je sais ça ressemble beaucoup aux exemples que je viens de donner précédemment, disons que c’est volontaire). Les anciennes urls ne contiennent que le nom du produit.

Voici donc comment nous allons procéder, étapes par étapes.

1 -Création du fichier de correspondance

Admettons que votre BDD possède 2 tables (parmi tant d’autres) : une table marque et une table produits avec une foreign_key sur l’id de la marque (id_marque) parce que vous êtes réceptif aux performances de votre site web.
Dans votre table produit, vous possédez un champ produit_alias qui sert à générer votre url (exempt de tous caractères non supportés par la RFC), idem pour votre table marque qui possède un champ marque_alias.

SELECT CONCAT(produits.produit_alias , ' ', marque.marque_alias) FROM `produits` LEFT JOIN `marques` ON ( produits.marque_id = marque.id )

Vous récupérez l’output de cette query que vous allez placer dans un fichier ProductMarque.txt à la racine de votre site (choisissez un nom explicite, c’est toujours mieux).

2 – Modification de votre vhost

Maintenant que vous venez de créer votre joli fichier de correspondances, il va bien falloir dire à mister Apache de l’utiliser.
Pour cela, nous allons modifier le vhost de notre site www.example.com en y ajoutant la ligne suivante :

RewriteMap marques txt:/var/www/example.com/ProductMarque.txt

Dans cette exemple, « marques » va nous servir dans notre regexp de re-écriture dans notre fichier .htaccess

3 – Ecriture de votre règle dans votre .htaccess

Whaoo, ça sent la fin n’est ce pas !! Ne perdez pas courage, nous y sommes presque.

RewriteRule ^([[:lower:]-]+[0-9]+).html$        /${marques:$2|0}/$1.html        [R=301,L]

Et Bam dans les gencives. Plus sérieusement, on explique, on explique 😉
– RewriteRule ^([[:lower:]-]+[0-9]+).html$ => Cette regexp ne doit pas vous poser de problemes, on filtre dans notre exemple sur produit1.html
– /${marques:$2|0}/$1.html [R=301,L] => La en effet ça mérite quelques éclaircissements.
Le ${marques:$2|0} signifie : remplace par la deuxième colonne de mon fichier de correspondances marques (souvenez vous j’ai dis plus haut qu’on allait s’en servir) et si il ne trouve pas de correspondance, remplace par 0 (c’est un choix, car c’est extrêmement facile à déceler dans les logs).
Si dans ma requête sql, j’avais choisi de mettre les marques en première colonne et les produits en deuxième, il aurait fallu mettre $1 à la place de $2.
J’ai pris un exemple assez simple afin d’expliquer le fonctionnement des RewriteMap, mais sachez que vous n’êtes pas limités à 2 colonnes 😉
(J’appelle dans ce billet colonne les champs séparés par un espace).

Limites des RewriteMap

Comme nous avons pu le voir dans cet exemple, l’utilisation des RewriteMap peut s’avérer relativement pratique dans certains cas. Mais ATTENTION elle possède cependant ses limites. Dans l’exemple que j’ai volontairement pris, nous ne pouvons pas rencontrer de probleme puisqu’au départ les urls possèdent l’id du produit. Mais imaginons un instant que l’id ne soit pas présent et que 2 (ou plusieurs) produits se nomment exactement pareil mais n’appartiennent pas à la meme marque ? Bon OK c’est un peu tordu, mais comme j’ai eu à le faire, imaginons maintenant que vous travaillez sur une base region/departement/ville ou vous conviendrez que plusieurs villes se nomment de la même maniere dans differents departements/regions => bon courage !!
Dans ces cas particuliers, il suffit de ne pas intégrer les doublons dans votre fichier de correspondance, mais de les traiter à la main (ou bien de faire une sélection pour vos correspondances). On peut dans ce scénario rediriger l’internaute sur une page proposant divers choix, en listant toutes les marques pour lesquelles le produit se nomme de cette façon par exemple.

Lectures indispensables :
– La directive RewriteMap sur le site officiel d’Apache
– Un must read qui date de 2006 mais toujours d’actualite : Stupid htaccess Tricks
– Pour ceux qui ont deja jete un oeil a ma blogroll, THE site sur Apache (Askapache.com) avec son .Htaccess rewrites, Mod_Rewrite Tricks and Tips

13 réponses sur « RewriteMap : How-To »

Cet article tombe à pic !

Pour nos études, nous devons référencer un site…

Et celui que nous avions repris a environ 600 erreurs 404, et je ne voyais pas vraiment comment les supprimer…

Où est ce que j’envoie le chèque? 😉

Ah … les fameuses campagnes de redirections page a page … quel bonheur… C’est un bon petit cas d’école .. la prochaine fois que je bloque sur des ré-écritures PHP je te contacte ..

Comme quoi…. même si on ne sait pas à quoi ça sert, toujours inclure l’id unique du contenu dans l’url, ça servira toujours un jour ^^

Merci pour cet excellent article

Tout bonnement excellent
J’espère que ce petit article passera vite en tête sur les moteurs car franchement c’est parfois l’usine a gaz ce genre de chose.

Vous m’enlever une fiere chandelle du pied Môsieur

Le grand copier/coller n’a qu’a bien se tenir!

Amitiés
Wilfried

Comme d’habitude un article clair efficace et intéressant. Merci beaucoup pour ces infos.

RDD a encore frappé avec un article au top ! Ca me rappelle de longues minutes de création de concordances des URLs dans un fichier excel 🙂

@Conception d’applications mobiles
J’avais tellement chercher a l’epoque pour trouver un moyen « radical » pour effectuer ces redirections que j’ai decide de faire un article rien que pour ca 😉

@Le juge
No problemo, mister !!

@Marie-Aude
Exactement, a une certaine époque le fameux « mythe » de l’url clean qui aidait au ranking a laissé aux dev et admin sys un bien beau cassage de tête pour les refontes de sites 😉

@John
Pour les gros sites c’est en effet beaucoup trop de travail pour que ça puisse être réalisé à la main (je le sais puisque les RewriteMap m’ont aidé à rediriger quelques 4M de pages).

@Wilfried
Oui et a mort le copier/coller 😉

@Vince @referenceur @Imprimerie en ligne
Merci

@dldstyle
Clair !! Perso ça a commencé a me souler dès qu’il y avait plus de 10 pages à rediriger, c’est pour cette raison que je me suis tourné vers une solution beaucoup beaucoup beaucoup plus adaptée.

@proteine
Je vais chercher une plateforme d’affiliation pour vendre de l’aspirine en ligne alors 😉

@tous
Desole de vous répondre si tardivement, mais les 2 dernières semaines furent chargées !!

Merci bcq … Oh qu’oui c’est clair… Oh qu’oui …
Oh qu’oui ça l’éclair mes neurons….

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *