Redirection par .htaccess après migration d'un site
Tagged:  •    •  

Comme vous l'avez certainement remarqué, j'ai migré mon blog motorisé par Wordpress vers un cms basé sur Drupal, j'ai repris l'historique des articles de Wordpress et je suis passé d'un sous-domaine à un domaine, avec au passage un changement d'identifiant des articles (indépendant de ma volonté), rien que ça !
Le problème, comment ne pas perdre le référencement des moteurs de recherche, comment rediriger les liens des sites référents vers le nouveau site au bon endroit ?

Apache et son mod-rewrite

En fait, ce n'est pas très compliqué, un simple fichier peut faire l'affaire. Si comme nous, les pages de l'ancien site sont servies par un serveur Apache, vous pouvez faire votre redirection en placent quelques directives à destination du mod_rewrite dans un fichier .htaccess à la racine de ce site.

Parmi toutes les directives à disposition, deux possibilités sont envisageables: 1. la liste de toutes les redirections à effectuer avec RewriteRule, ou 2. l'utilisation de la directive RewriteMap. Malheureusement, seule la première est techniquement réalisable. En effet, il semble que les RewriteMap ne peuvent pas être employées dans un fichier .htaccess et doivent être définis au niveau de la configuration du server ou du virtual host...

Enfin, pour des cas plus compliqués, il est tout a fait possible d'établir des conditions pour la réécriture d'URL avec RewriteCond ou de faire du log dédié avec RewriteLog et RewriteLogLevel. Bref, un fonctionnement très souple et très fin qui ne demande qu'à être utilisé. Par exemple, nous avons également utilisé le mod_rewrite d'Apache dans d'autres conditions pour forcer la redirection vers un nom d'hôte complet.

De la théorie à la pratique

Exemple

Voici un extrait du mien pour vous donner une idée :

RewriteEngine on
RewriteBase /
RewriteRule ^archives/2.*$ http://www.fbollon.net/node/2 [L,R=301]
RewriteRule ^archives/12.*$ http://www.fbollon.net/node/10 [L,R=301]
RewriteRule ^archives/22.*$ http://www.fbollon.net/node/16 [L,R=301]
RewriteRule ^archives/94.*$ http://www.fbollon.net/node/73 [L,R=301]
...

RewriteRule ^$ %{QUERY_STRING} [C]
RewriteRule p=2 http://www.fbollon.net/node/2 [L,R=301]
RewriteRule p=12 http://www.fbollon.net/node/10 [L,R=301]
...

RewriteRule ^ubuntu/*$ http://www.fbollon.net/ubuntu_trucs_astuces [L,R=301]
RewriteRule ^fonds-decran/*$ http://www.fbollon.net/wallpapers [L,R=301]
RewriteRule ^about/*$ http://www.fbollon.net/about [L,R=301]
RewriteRule (.*) http://www.fbollon.net/ [L,R=301]

Explications

RewriteRule, simplicité et efficacité

RewriteRule ^archives/94*$ http://www.fbollon.net/node/73 [L,R=301]

Sur Wordpress l'url de ce billet était http://blog.fbollon.net/archives/94 avec Drupal sur le nouveau site après la reprise de données l'url devient http://www.fbollon.net/node/73

RewriteRule ^$ %{QUERY_STRING} [C]
RewriteRule p=2 http://www.fbollon.net/node/2 [L,R=301]
RewriteRule p=12 http://www.fbollon.net/node/10 [L,R=301]

Sur Wordpress on peux accéder aux billets par une url du type http://blog.fbollon.net/?p=12 le "?p=12" sont des paramètres d'url il faut donc précéder les RewriteRule par

RewriteRule ^$ %{QUERY_STRING} [C]

pour que la redirection fonctionne dans ce cas

Expression régulière, la puissance à l'état brut

^archives/94*$
" ^ " et " $ " sont les limites ce que l'on veux rediriger est à l'intérieur, j'ai rajouté * pour les url du genre http://blog.fbollon.net/archives/94#comments

Flags de fin de ligne, petits mais costauds

Pour les flags [L,R=301] :

  • L pour arrêter le processus de ré-écriture, quand une règle est appliquée.
  • R=301 pour préciser qu'il s'agit d'une redirection définitive

Pour le flag [C] :

  • C pour chainer la règle avec les règles suivantes

Redirection finale, ou le ramasse-miettes

et pour finir pour tout ce que j'aurais pu oublier, je renvoie tout sur le nouveau site:

RewriteRule (.*) http://www.fbollon.net/ [L,R=301]

Conclusion

Le plus long c'est de faire le mapping.

Le résultat, testez le vous même. Cliquez sur ces deux liens, vous arriverez au même endroit: http://blog.fbollon.net/archives/94 et http://www.fbollon.net/node/73

Liens

  • Guide officiel mod_rewrite sous Apache illustré de nombreux exemples
  • Documentation du mod_rewrite pour les versions 1.3 et 2.0 d'Apche