Gérer les redirections de son site WordPress en cas de déménagement
Il ne suffit pas de déménager son site WordPress correctement. Il faut aussi, c’est essentiel, rediriger les anciennes urls vers les nouvelles. Sinon, on perd tout le bénéfice de son référencement et des liens accumulés….
Rediriger les urls avec le fichier .htaccess
Il y a plusieurs façons de “rediriger” ou “réécrire” des urls. On peut le faire avec php, en incluant une instruction dans l’en tête de la page. On peut aussi le faire via un fichier de gestion du serveur Apache (Apache est un système d’exploitation pour serveurs web, et le plus courant ; il y en a d’autres, vous pouvez notamment être avec un serveur WindowsIIS, mais là on gère les réécritures autrement).
Le meilleur moyen de le faire sans prise de tête (si, si) est d’utiliser ce fichier, appelé .htaccess. En effet, quand on peut utiliser des règles concises qui s’appliquent à beaucoup de pages, cela va plus vite : au lieu d’appeler une page, et ensuite de la rediriger grâce à l’instruction php, on le fait tout de suite.
Le fichier .htaccess est un peu particulier : c’est un fichier essentiel pour le bon fonctionnement de son site, en revanche, faire des erreurs dedans peut “tout casser”.
(Une partie de cet article est technique, vous pouvez, si vous débutez, aller directement à la solution, mais si vous êtes curieux, ou que vous aimez comprendre ce que vous faites pour éviter d’appliquer des solutions à l’aveugle, je vous conseille de tout lire).
Comment fonctionne un fichier .htaccess dans un site WordPress ?
A partir du moment où vous avez utilisé une structure de permaliens, WordPress a créé à la racine du blog, un fichier .htaccess qui contient au minimum ceci :
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Et c’est grâce à ces quelques lignes que WordPress sait afficher tout le contenu du blog…
décortiquons les pour les comprendre et pouvoir “ajouter” les nôtres sans panique.
Les deux lignes qui commencent par un # sont des commentaires. Elles ne sont pas prises en compte et servent simplement à se “souvenir” de ce qu’on a fait.
<IfModule mod_rewrite.c>
Ensuite WordPress vérifie que la fonction Rewrite d’Apache est installée. Si elle ne l’est pas :
- vous êtes sur votre propre serveur et vous êtes étourdi
- vous êtes sur un hébergement antique… et changez d’hébergeur
Si la fonction existe, alors on y va et on va exécuter tout ce qui se trouve avant la fin du test ( </IfModule> ).
RewriteEngine On
On fait démarrer le moteur de réécriture (on l’active au cas où ce ne serait pas le cas) et on définit la “base”
RewriteBase /
Cela permet en effet de dire à quelle url “de base” les urls réécrites vont être rattachées.
Lorsque vous installez votre blog WordPress, vous avez défini une url du blog, c’est celle qui sera la “base”.
/ veut dire que votre blog est installé à la racine de votre domaine ou de votre sous-domaine. Si vous avez installé WordPress avec le module d’OVH dans un dossier WordPress3, votre RewriteBase sera /WordPress3/ .
RewriteRule ^index.php$ - [L]
Le [L] veut dire qu’on s’arrête, et qu’on ne va pas exécuter les instructions – néanmoins tout le fichier .htaccess est lu
Cette règle veut dire “si j’ai un fichier qui s’appelle index.php avec quoique ce soit devant ou quoi que ce soit derrière, alors il n’y a pas de réécriture”.
C’est ce qui permet :
- de ne pas essayer de réécrire les urls de WordPress quand les permaliens ne sont pas activés ( genre index.php?p=22 pour affichier l’article dont l’id est 22 )
- empêcher de réécrire les urls des fichiers index.php dans les sous-répertoires, notamment wp-content/plugin qui empêche les petits curieux de voir facilement la liste de tous vos plugins.
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d
Ces deux règles sont extrêmement importantes : elles disent que s’il existe un fichier ou un répertoire physique, on ne cherche pas à appliquer les règles de réécriture.
Autrement dit… vous avez un article dans votre blog dont l’url serrait urldusite.com/toto-titi ET vous avez un répertoire à la racine de votre site qui s’appelle toto-titi , vous ne verrez pas le fichier, parce que Apache va afficher le répertoire (et donc sa liste de fichiers).
RewriteRule . /index.php [L]
C’est finalement la règle de réécriture qui fait tout…
Le point veut dire “tout et n’importe quoi”, donc “tout et n’importe quoi qui n’est pas un fichier index.php, ou un fichier ou un répertoire existant est réécrit par WordPress grâce au fichier index.php et à la gestion des règles de réécriture.
Les règles de réécritures dans WordPress
Elles sont gérées dans la base de données, et dans le “core” de WordPress. (Si vous n’êtes pas curieux, vous pouvez sauter directement à la conclusion, ici)
Le fichier qui va donc être appelé est index.php, lequel fait un certain nombre de contrôles, et charge “tout” WordPress, y compris l’ensemble d’instructions pour la réécriture, localisées dans /wp-includes/rewrite.php et une fonction essentielle, qui va décomposer l’url appelée pour préparer sa traduction pour le moteur de réécriture, localisée dans /wp-include/class-wp.php
Dans ce fichier, la fonction essentielle pour nous est à la ligne 120, avec parse_request() qui va traiter les variables envoyées à index.php avec la dernière règle de rewrite et tout particulièrement REQUEST_URI : l’url qui a été donnée initialement, donc l’url réécrite
Ce paramètre est traité grâce à deux fonctions, “magiques” dans /wp-includes/rewrite.php
La première se trouve à la ligne 1226, c’est generate_rewrite_rules qui donne toutes les expressions régulières possibles, triées par priorité, qui permettent de découper en morceau une url, en fonction des options du blog.
Et même les développeurs du Core de WordPress parlent de magie :
The contents of the function is a mix of black magic and regular expressions, so best just ignore the contents and move to the parameters.
Ensuite, à la ligne 1518, la fonction rewrite_rules utilise generate_rewrite_rules et, pour une url donnée, construit l’ensemble des “possibilités théoriques” qui vont ensuite être rapprochées des éléments qui existent réellement dans la base de données, pour voir ce qui peut s’appliquer à une url précise.
Autrement dit :
- WordPress enregistre en base de données ce qu’on appelle des schémas d’url, qui permettent, par exemple, de savoir que urldemonsite.com/2012/08/ doit appeler une archive par date, et pour le mois d’août 2012
- Toutes les urls d’un site appellent en réalité, via la réécriture, un fichier unique, index.php, qui va traiter l’url
- la comparer aux schémas existants pour voir à “quel type de page” elle peut correspondre
- une fois trouvé le(s) type(s) de page, aller chercher dans la base de données si il y a effectivement un article, une catégorie, etc qui correspond à la valeur des paramètres. Dans notre exemple, si vous n’avez pas écrit d’article en août 2012, WordPress vous renverra une page d’erreur en vous disant “j’ai compris que tu voulais les articles d’août 2012 mais je n’ai rien trouvé.
- Et les règles de réécriture sont faites par rapport au RewriteBase du .htacces, qui utilise l’url du blog définie dans les options générales.
Et mon déménagement de blog alors ?
Le problème, c’est que lorsqu’on déménage un blog, on change généralement ce “RewriteBase” :
- on change de nom de domaine
- on passe d’un sous-domaine au nom de domaine
- on passe d’un sous-répertoire au nom de domaine
Or TOUS les plugins qui gèrent des redirections dans WordPress utilisent les règles de réécritures de WordPress, c’est-à-dire qu’ils travaillent par rapport au RewriteBase
Et comme celui-ci a changé….
On va donc intervenir directement dans le .htaccess en rajoutant à la main une règle qui va réécrire TOUTES les urls de la forme ancienne_url_du_blog.url_de_contenu_wordpress à nouvelle_url_du_blog.url_de_contenu_wordpress (la même)
Et pour que cela soit pris en compte, on va l’insérer dans le .htaccess AVANT les règles WordPress dans le cas où les deux urls pointent sur le même répertoire du serveur, ou bien dans un .htaccess tout seul, si le répertoire de l’ancien nom de domaine est différent.
Premier cas : on change de nom de domaine, ou de sous-domaine
Cette règle est très simple :
RewriteEngine On RewriteCond %{HTTP_HOST} ^ancienne_url.com [NC] RewriteRule ^/?(.*) http://nouvelle_url_du_blog/$1 [L,R=301]
Ce qui veut dire
Au cas où l’url qui est demandée commence par “ancienne url du blog”, alors, tu prends tout ce qui vient après le “/”, tu remplaces l’ancienne url par la nouvelle, et tu rajoutes ce que tu avais trouvé après le / , et tu dis à Google que le contenu a déménagé définitivement (R=301] pour qu’il le prenne en compte
… la nouvelle url va ensuite être traitée par le bloc WordPress.
Attention, dans la première ligne, il faut mettre un antislash (la barre oblique arrière) avant le . de l’extension. (Ici je ne peux pas, WordPress m’en supprime l’affichage). Même chose si vous étiez en sous-domaine, vous écrirez
^www.ancienne_url.com
(oui, le www est un sous domaine).
Deuxième cas : on passe d’un sous-répertoire au domaine principal
On pourrait mettre une règle dans le .htaccess principal, mais elle serait “lue” à chaque passage. A mon avis, il est plus simple de mettre un simple .htaccess dans le répertoire physique où était WordPress, notamment parce que cela permet de ne pas se mélanger les pinceaux avec d’autres règles, ou de gérer des problèmes de priorité.
Ce .htaccess a l’avantage d’être particulièrement simple :
RewriteEngine on RewriteRule ^(.*)$ /$1 [R=301,L]
Autrement dit… “active le rewrite, et redirige tout ce qui est ici vers la base (nom de domaine) en rajoutant ce qui vient après le nom du répertoire. (et toujours sans oublier le 301).
Concrètement, voir et éditer son fichier .htaccess
Accéder au fichier sur le serveur et l’ouvrir dans Windows
.htaccess est un nom de fichier Apache, Windows, a priori, ne le reconnait pas. C’est un fichier “caché” (son nom commence par un . ) Certains logiciels FTP, comme Filezilla, ne les montrent pas, par défaut.
Solution 1 : utiliser l’explorateur de fichier de votre hébergeur, à partir de votre panneau de gestion, qui vous permet de voir tous les fichiers, même les fichiers “cachés”.
Solution 2 : allez dans le menu serveur de Filezilla pour forcer l’affichage des fichiers cachés. Je vous ai trouvé un bon tuto ici, ne me demandez pas plus de détails, je n’utilise pas Filezilla.
Comme Windows ne le reconnait pas, il peut être un peu difficile de le modifier.
Avec un clic droit sur le fichier, vous voyez s’afficher “Ouvrir avec” et là vous pouvez choisir le bloc-notes. Mieux, vous installez Notepad++ qui est un excellent éditeur gratuit, et, toujours avec le clic droit, choisissez “Editer avec Notepad++”.
Le modifier
La seule consigne est de faire particulièrement attention… par exemple, mettre un double espace au lieu d’un simple espace peut dans certains cas poser des problèmes.
Si vous n’arrivez pas à l’enregistrer parce que windows vous dit que ce n’est pas un nom de fichier correct, faites lui plaisir, appelez-le htaccess.txt
Remplacer l’ancien .htaccess
La prudence est mère de sûreté : on ne va pas écraser tout de suite le fichier existant sur le serveur, avant d’être certain que tout se passe bien.
- Etape 1 : dans votre logiciel FTP, faire un clic droit sur le fichier .htaccess et le renommer par exemple en _.htaccess (un seul caractère suffit)
- Etape 2 : charger via FTP votre nouveau .htaccess. Si vous avez dû l’appeler htaccess.txt, clic droit, renommer en .htaccess
- Etape 3 : aller sur votre site. Si il y a une erreur genre 500, 503, 403, 401 … remettez en place l’ancien .htaccess tout de suite. Sinon passez à l’étape 4 :
- Etape 4 : testez que les règles de réécritures fonctionnent. Si oui, vous pouvez supprimer l’ancien .htaccess , sinon vous pouvez m’appeler au secours !
(Les panneaux de redirections sont une photo sous licence CC BY NC SA de Sharon Drummond )
Merci pour cette article.
Un peu technique, mais très bien détaillé et expliquer, je me le garde en réserve au cas où………
Bonjour. Cet article tombe pile poil pour moi ! Je peux témoigner de ce que j’ai exporté un blog hébergé chez WordPress.com pour l’importer dans un WordPress installé sur un serveur (chez OVH). J’ai utilisé la procédure “d’exportation” classique (qui m’a donné un fichier xml), puis j’ai récupéré ce fichier depuis mon serveur par “Outils – Importation depuis WordPress”.
Mon intention est en effet de créer un site pro “classique” (genre site vitrine, toute bête, sans e-commerce), avec une section “Blog” (reprenant tout ou partie de mes anciens blogs, donc…).
Tout s’est passé impeccablement… catégories, tags, tout le tralala… y compris les images qui étaient hébergées auparavant chez WordPress.com ! J’ai donc retrouvé mon blog pratiquement à l’identique.
Seul inconvénient mineur : les quelques personnalisations de mise en page que j’avais faites auparavant sur le serveur avaient sauté (j’utilise un thème enfant de U-Design). J’ai retrouvé l’horripilante image d’en-tête par défaut, et le non moins horripilant logo tout pareil…
Je m’attendais un peu à tout, y compris à la disparition des images personnalisées que j’avais utilisées auparavant. Il n’en était rien ! Inexplicablement, il m’a suffi de reprendre la même procédure qu’auparavant (dans mon cas : Tableau de bord – U-Design – Couleurs personnalisées (si si… pas évident à trouver la 1ère fois :-)) – et enfin Image d’arrière plan). Étonnamment, le nom de la “bonne” image était déjà renseigné, je me suis contenté de valider, et miracle, tout est revenu (y compris le logo, pour lequel je m’attendais à refaire la même procédure).
Y’a pas à dire… les voies du seigneur de la toutouille web sont souvent impénétrables, mais quand ça se solde de cette manière, on ne va pas bouder notre plaisir !
Un grand merci, donc, à une Lumière qui n’a jamais aussi bien porté son nom (à mes yeux, il s’agit carrément d’un phare qui m’a plus d’une fois guidé dans les tempêtes de l’incertitude ;-)
Merci à toi :)
et contente de savoir que les images “suivent” quand on déménage de WordPress – tu es sûr qu’elles ont été uploadées sur ton serveur ? Ce n’est pas parce que le blog a encore les urls des images sur wp.com ? (je pose la question parce que sur des gros blogs, si ils gèrent comme ça, ça peut être assez monstrueux comme transfert).
Super tutoriel, surtout pour moi qui ne suis pas un expert du CMS WordPress, je découvre le principe du schémas d’url dans WP !
Voilà ce qu’on appelle une Ressource avec un grand R!
Curieusement, j’ai déjà eu à me servir de ces techniques pour le déménagement d’un wp client … mais sans vraiment comprendre les moindres détails de tous le charabiat :p (Détrompez-vous, tout s’est bien passé)
Et comme par hasard, je tombe sur cet article juste au moment où je m’apprète à déménager et lancer mon blog perso ;)
Bref, vous aurez bientôt de mes (bonnes) nouvelles!
Bravo et merci pour cette article
Merci pour le tuto, ça me servira surement dans le futur, surtout qu’il est bien écrit et bien compréhensible.
Bonjour,
Etant moi même esclave de google et de ses algorithmes, j’aimerai savoir si vous envisagez un tutoriel pour le passage d’un blog en httpS ( et oui on va devoir s’y mettre à ce foutu certificat inutile, tels des moutons nous suivons notre guide Google ). et que faire au niveau du rewrite des URLs justement…
Merci !
Aucune chance pour ma part que je migre vers le https des sites vitrines pour les beaux yeux de Google. Et puis si cela devient la nouvelle norme, alors les malwares se mettront à niveau et on sera repartis comme en 40, sauf que cette fois on aura réussi à faire cotiser l’intégralité du web au SSL à 20€/mois/site. Elle est pas belle la vie? Non mais sérieusement, quand on atteint presque 100% de part de marché, je comprends que pour chopper de la croissance il faille trouver de nouveaux segments, mais celui là non merci… tant que je pourrais ne pas y aller, je refuserai le https imposé pour le SEO.
Pour revenir à l’article , il y a des plugins de redirection 301 qui existent pour WordPress et qui sont très simples à gérer. une raison pour passer en direct via la manip FTP du .htaccess Marie Aude?
moi c’est ce que je faisais, mais avant.
En fait j’utilise ces plugins pour des redirections ponctuelles, pas pour des déménagements. Pour des déménagements, l’essentiel c’est la correction du contenu de la base de données.
Pourquoi utiliser le htaccess ?
Parce que ce n’est pas un plugin, et ça ne risque donc pas de sauter pour une raison ou une autre
Parce que sur un grand nombre d’urls, une rewrite rule est, à mon avis plus performante
Parce que cela traite TOUS les types d’adresses, y compris commentaires, images, etc… ce qui est rarement le cas des plugins de redirection — et quand c’est le cas, il le font via une rewrite rule, donc autant l’écrire directement
Et pourquoi écrire directement les rewrite rules au lieu de les gérer via un plugin, dans l’option de wordress ?
Parce qu’on les VOIT, et qu’on peut donc facilement comprendre le jour où on a fait une bêtise et qu’on a une boucle de redirection ou un autre problème.
Sinon la rewrite rule dans le .htaccess intervient avant même WordPress donc on peut considérer que c’est légèrement plus performant.
Bonjour,
Merci pour votre tutoriel. J’essaie de tout faire comme indiqué mais ça ne fonctionne pas. Je vous avoue que je m’arrache les cheveux ;)
Je veux changer de nom de domaine, mon blog wordpress était installé ici : et je souhaite tout migrer vers http://www.blogenroute.fr/ . J’essaie beaucoup de choses depuis hier, mais rien ne marche. Il faut dire que je n’y connais pas grand chose. OVH m’avait dit que c’était très simple, mais pas pour moi il faut croire !
Bonjour Héloïse, ça a l’air effectivement de ne pas très bien se passer…. Les deux noms de domaines sont bien sur le même compte OVH ? Il faut parfois un peu de temps pour que les modifications soient prises en compte.
La gestion des redirections intervient après le déménagement, le tuto sur le déménagement ressemble plutôt à ça http://lumlune/wordpress3-ovh-automatique,2014,06
Sinon au pire des cas, il y a ça http://lumlune/services/optimisation-correction-wordpress-ovh ^^
Je pense que je vais faire appel à vous car je patauge vraiment dans la semoule !
salut
Merci pour votre tutoriel.
*Je veux redirection de nom de domaine, exemple . http://www.example.com à http://www.example.org
*example.com just le nom de domaine a hebergé sur le serveur name.com et l’autre site que je travaillé c’est un nom de domaine plus hébergement appelé example.org sur LWS.fr
* j’ai entre dans le serveur name.com il me dit il faut prépare un meta tags
*dabord mon question lorsque je creer le meta tags est ce que je le mais sur le templet de site par filezila et aussi dans name.com pour que le redirection example.com redirege vers example.org
cordialement
Bonjour Marie-Aude,
Petite question, si mes permaliens sur l’ancien url était de type ancien-ndd.fr/date/titre-article
Quelle règle puis-je appliquer pour rediriger vers nouveau-ndd.fr/titre-article ?
Merci
bon article, clair et détaillé.
Merci pour ces précisions très utiles.
J’avais fait la même redirection d’un déménagement de site en PHP mais cela ne fonctionnait pas à 100% pour toutes les URL.
En l’effectuant avec le htaccess cela parait beaucoup plus efficace.
Bonjour,
merci pour cet article impeccable, bien plus aisé à digérer que la doc Apache.
Ma collection de signets à haute valeur ajoutée s’enrichit ;)
Bonjour,
Alors ça c’est un article technique qui mets en lumière le fonctionnement de htaccess sur wordpress. très instructif
Justement j’ai besoin de rediriger des urls sur mon site (un petit paquet d’url soit environ 700 urls). en fait je souhaite enlever le mot category de mes urls avec yoast mais avant je souhaite préparer une redirection en masse de toutes mes urls contenant le mot category.
je me permet de mettre mon htaccess ainsi que ma nouvelle règle de réécriture :
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteRule ^http://example.com/category/$1$ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
j’hésite à faire le test par peur de tout faire sauter sur mon site :)…peut être que vous arriverez à m’aiguiller
est ce que d’après vous cette nouvelle règle peut fonctionner? si vous trouvez pas opportun de mettre cette question dans vos commentaires, je peux comprendre et dans ce cas je m’excuse d’avance pour la gêne occasionnée.
en tout cas merci pour cet article très technique
Bonjour
non cette règle ne peut pas fonctionner, car elle ne corrige pas la règle de réécriture standard de WordPress pour les catégories. Comme les règles de réécriture sont gérées en base de données, WordPress recevra l’url sans le /category/ et la prendra pour un article, ce qui donnera une 404
Il existe un plugin “no category base” de mémoire, qui permet de faire ce que vous voulez. Vous pouvez regarder comment il fonctionne.
ok d’accord. j’ai regardé le plugin et en fait il traite la redirection directement dans la base de donnée, donc effectivement ça peut être une solution au problème.
donc j’installe le plugin et la redirection se fait automatiquement? je trouve ça bizarre !! et est ce que ce plugin va fonctionner dans le temps avec toutes mes urls anciennes et nouvelles? mais je vais quand même testé, il m’intrigue ce plugin.
je viendrais faire un retour si tu veux
en fait la gestion du htaccess par wordpress complique un peu les réécritures d’url, vu que chaque url est inscrit dans la base de donnée. On a pas trop la main pour personnaliser nos urls quand on en a besoin. A part passé par un plugin ça me semble difficile d’utiliser htaccess pour mon cas. je pense que j’ai pas encore tous saisi sur le son fonctionnement. il va falloir que je bosse encore un peu pour faire des redirections par lot via le htaccess de wordpress,
merci pour le tuyau sur le plugin “no category base”
je viens de trouver un site qui utilise htaccess pour supprimer le “category” dans les ursl de wordpress. je vous mets le lien ci contre :
-www.wppourlesnuls.com/10-astuces-htaccess-pour-wordpress/
sur ce site il explique bien comment utiliser le htaccess pour traiter ce genre de cas plus d’autres astuces.
RewriteRule ^category/(.+)$ http://www.yourblog.com/$1 [R=301,L]
me voilà avec deux options très correcte…je fonce tester ça.
C’est curieux quand même que vous soyez tombé par hasard sur ce site récent et mal référencé. Et qu’un développeur expérimenté comme vous n’ai même pas le réflexe de cliquer sur le lien source, pour voir qu’il s’agit d’un truc copié dans un autre site qui date de 2009 et qui ne marche pas vraiment (suffit de lire les commentaires).
oui effectivement en lisant les commentaires on peut voir que cette solution n’est pas franchement optimale.
d’ailleurs il parle tous du plugin no category base et que ce plugin marche parfaitement bien.
je suis allez un peu vite sur ce coup là.