Je vais présenter ici la gestion des changements d’adresse d’un site Web.
Sont concernés les changements de nom de domaine, d’hébergeur,
déplacements de pages, de documents ou de répertoires, suppressions de documents ou de répertoires, etc.
Bien sûr, il faut prévoir, lors de la conception d’un site, une arborescence suffisamment bien hiérarchisée pour ne pas avoir à déplacer des fichiers. Néanmoins, lorsque cela se produit, une bonne gestion des redirections diminue l’impact négatif, sur les utilisateurs, mais aussi sur les moteurs de recherche.
La philosophie principale est de conserver le plus longtemps possible les redirections,
de telle sorte que même les plus anciennes adresses pointent toujours sur le fichier le plus pertinent.
Voyons ici les différentes méthodes dans plusieurs situations.
Voir aussi mon script de de redirection HTTP gérée par une page d’erreur 404 personnalisée.
La redirection HTTP est la meilleure méthode, quel que soit le changement opéré,
à partir du moment où l’hébergeur du site autorise ce genre de chose.
Je vais détailler la redirection HTTP sous Apache, un des serveurs Web les plus répandus,
en me basant sur la documentation officielle des alias Apache,
et sur la référence des codes HTTP.
Pour ceux sous un autre serveur, comme Microsoft IIS, voir mon script de de redirection HTTP gérée par une page d’erreur 404 personnalisée.
Tout fonctionne grâce à un ou plusieurs fichiers textes .htaccess Apache à placer dans l’arborescence du site.
Attention, il s’agit d’un fichier texte (comme les fichiers HTML) à télétransmettre par FTP (préférablement en mode ASCII) sur votre serveur Web.
Attention aussi aux slashs / car tous les caractères sont importants !
Voir ma documentation sur comment configurer PHP avec Apache2
pour plus d’informations sur l’activation du .htaccess
Les différentes parties de cet exemple seront expliquées plus tard.
.htaccess <IfModule mod_alias.c> Redirect permanent /dossier01/page01.html http://nouvelle.adresse.fr/dossier03/page02.html RedirectMatch permanent /dossier01/(.*)\.html$ http://nouvelle.adresse.fr/dossier02/$1.php Redirect permanent /dossier01 http://nouvelle.adresse.fr/dossier02 Redirect permanent / http://nouvelle.adresse.fr/ </IfModule>
Les instructions de redirection doivent être rangées de la plus précise (déplacement d’un fichier spécifique)
à la plus générale (déplacement d’un répertoire complet ou même du nom de serveur).
Les adresses doivent toujours être complètes, quel que soit l’emplacement du .htaccess :
Il n’est pas nécessaire de redémarrer Apache pour qu’une modification dans un .htaccess soit prise en compte.
En général, tous les fichiers et répertoire de l’ancienne adresse autres que le .htaccess peuvent être supprimés.
Mais attention, chez certains hébergeurs comme Lycos Multimania au moment où j’écris,
il faut conserver les anciens répertoires, pages et documents, car la présence du fichier est testée
avant les règles contenues dans le .htaccess
Je conseille alors, en plus de la redirection HTTP,
de remplacer le contenu des pages et documents par une redirection HTML
(cela n’a pas beaucoup d’importance, c’est juste dans un souci de place et de propreté).
Une erreur dans le fichier .htaccess se traduira par une erreur HTTP standard 500 “erreur interne du serveur”
lors de l’accès à n’importe quelle adresse située sous l’arborescence concernée
(tout le site si le .htaccess concerné se trouve à la racine).
La correction de l’erreur ou la suppression du fichier .htaccess rétablira la situation.
Ceci est le cas où le site reste totalement identique, mais change d’adresse principale.
Le but est de rediriger toutes les anciennes adresses vers les nouvelles.
Exemple :
Ceci est réalisé très simplement avec un seul fichier .htaccess placé à la racine de l’ancienne adresse.
.htaccess Redirect permanent / http://nouvelle.adresse.fr/
Ceci envoie un code HTTP 301 redirection permanente
qui informe les navigateurs,
et surtout les moteurs de recherche, qu’il faut mettre à jour leurs liens vers la nouvelle adresse.
Notez qu’un simple changement d’hébergeur en conservant le même nom de domaine ne nécessite aucune redirection HTTP.
Ceci est le cas où un répertoire complet change de place (ou de nom) sur le même serveur.
Exemple de déplacement d’un répertoire (et de toute son arborescence) :
À nouveau, cela se réalise avec une seule commande dans un fichier .htaccess qui doit se trouver quelque part plus haut dans l’arborescence que le répertoire à déplacer, comme à la racine du site.
.htaccess Redirect permanent /dossier1 http://adresse.actuelle.fr/dossier2
Ceci est le cas où une page ou un document change de place (ou de nom) sur le même serveur.
Exemples de déplacements de documents :
Cette fois-ci, cela nécessite une ligne particulière pour chaque document. (Voir plus loin pour des techniques plus avancées)
.htaccess Redirect permanent /page3.html http://adresse.actuelle.fr/page4.html Redirect permanent /dossier3/document2.pdf http://adresse.actuelle.fr/dossier4/document3.pdf
Une suppression définitive signifie qu’un document a été supprimé complètement, et qu’aucun autre document, sur ce serveur ou un autre, ne peut le résumer ni prendre sa suite.
Il est courtois et utile dans ces cas-là, lorsqu’un utilisateur ou un moteur de recherche cherche à y accéder,
de remplacer le message 404 document non trouvé par un message 410 document n’existe plus.
Cela signifie qu’il n’est pas nécessaire de réessayer plus tard, les liens peuvent être mis à jour,
ce document n’existe vraiment plus.
Contrairement aux redirections qui devraient être maintenues plusieurs années,
les gestions des suppressions définitives peuvent être mises en place pour un temps plus court (1 an).
.htaccess Redirect gone /dossier1/vieux.html Redirect gone /vieux-dossier/
Les extensions sont le groupe de lettres (3 ou 4 en général) qui suivent le dernier point dans un nom de fichier, comme .html .php .css .gif .jpg .xml entre autres.
S’il y a un tout petit nombre de fichiers qui doivent changer d’extension,
il est possible d’utiliser les techniques ci-dessus.
Notez que l’on emploie de préférence seeother 303
à la place de permanent 301
car lorsque l’extension change, cela signifie souvent que le type de document change aussi.
.htaccess Redirect seeother /dossier1/document4.doc http://adresse.actuelle.fr/dossier1/document4.pdf
Mais lorsqu’il s’agit de renommer les extensions d’un ensemble de fichiers, une autre technique avec des filtres à expressions régulières est beaucoup plus simple.
.htaccess RedirectMatch seeother ^/images/(.*)\.jpg$ http://adresse.actuelle.fr/images/$1.gif
Il s’agit là d’une technique très puissante, qui offre toutes les possibilités des expressions régulières. (Des cas d’utilisation supplémentaires sont donnés ci-dessous)
Plus compliquée à comprendre, une redirection temporaire, de type HTTP 302
, peut être utile si vous déplacez temporairement des documents vers un autre emplacement,
mais que vous souhaitez que les utilisateurs et les moteurs de recherche conservent autant que possible l’ancienne adresse.
Cela peut être particulièrement utile lors de l’utilisation de serveurs multiples, téléchargements FTP, caméras Web, etc.
Un autre usage est lorsque vous disposez d’une part d’un nom de domaine intéressant mais associé à un espace de stockage restreint,
et d’autre part d’un compte spacieux mais avec une adresse peu utilisable.
Avec une redirection temporaire, les utilisateurs et les moteurs de recherche sont informés que votre bonne adresse d’origine peut être indexée et utilisée.
Exemple :
Ceci est à nouveau réalisé avec un fichier .htaccess placé à la racine de votre bonne adresse.
.htaccess Redirect temp /telechargement/ http://votre.longue.adresse.fr/et_compliquee/
Attention, cela n’est pas destiné à masquer l’adresse de destination. Les utilisateurs seront bel et bien redirigés vers l’adresse de destination, et c’est cette adresse de destination qui apparaîtra dans leur barre d’adresse.
Il est souvent nécessaire de plus personnaliser la redirection d’un répertoire. Voici quelques cas.
Il est parfois souhaitable de supprimer les fichiers d’un répertoire, tout en redirigeant les visiteurs vers une même page d’accueil.
.htaccess RedirectMatch seeother ^/dossier1/.* http://adresse.actuelle.fr/dossier2/index.html
Notez l’utilisation du seeother
car les visiteurs ne reçoivent pas le fichier escompté.
Un cas particulier plus simple est la redirection de la racine du site vers un sous répertoire :
Ici, la redirection ne doit opérer que lorsque c’est la racine qui est demandée, et pas un fichier ou un sous-dossier.
.htaccess RedirectMatch permanent ^/$ http://adresse.actuelle.fr/dossier1/
Il est aussi possible de rediriger la racine plus les pages par défaut :
.htaccess RedirectMatch permanent ^/(index\.html|index\.php)?$ http://adresse.actuelle.fr/dossier1/
Notez que si vous souhaitez simplement avoir un nouveau fichier par défaut (ou supplémentaire), par exemple Default.htm, il n’est pas nécessaire de faire une redirection, et il est plus efficace d’utiliser l’instruction prévue pour :
.htaccess <IfModule mod_dir.c> DirectoryIndex Default.htm index.php index.html </IfModule>
Si, par exemple sur une plateforme Windows, on ne veut pas faire de distinction entre les majuscules et les minuscules,
il est possible d’utiliser le code (?!)…
pour changer la sensibilité à la casse du texte qui vient après ce code.
.htaccess RedirectMatch permanent ^/avec-casse/(?i)Sans-Casse\.htm$ http://example.net/avec-casse/nouveau.html
Avec une technique similaire, il est possible de déplacer les fichiers d’un répertoire en excluant certains.
Nous souhaitons ici faire un déplacement en masse, mais exclure certains fichiers.
Exemples :
Il faut utiliser les redirections avec une assertion négative donnant la liste des fichiers à exclure (?! … )
séparés par une barre verticale |
:
.htaccess RedirectMatch permanent ^/dossier1/(?!exclu1\.html|exclu2\.php|exclu3\.png)(.*)$ http://adresse.actuelle.fr/dossier2/$1
Voyons comment rediriger les fichiers d’un répertoire, mais pas des sous-répertoires.
Exemple :
La solution consiste à filtrer le caractère /
, et par sécurité le caractère \
,
empêchant ainsi la règle de s’appliquer aux sous-répertoires :
.htaccess RedirectMatch permanent ^/dossier1/([^/\\]*)$ http://adresse.actuelle.fr/dossier2/$1
Voyons comment rediriger un répertoire, en excluant les fichiers existant qui restent au même endroit.
Exemple :
La solution passe par un mécanisme plus lourd mais plus puissant, le moteur de réécriture d’URLs :
/dossier1/.htaccess <IfModule mod_rewrite.c> RewriteEngine On #Le répertoire ne doit pas exister RewriteCond %{REQUEST_FILENAME} !-d #Le fichier ne doit pas exister RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ http://adresse.actuelle.fr/dossier2/$1 [R=301,L] </IfModule>
Lorsque sur le même hébergement, vous disposez de plusieurs noms de domaine (DNS),
mettons exemple.fr (choisi comme principal),
www.exemple.fr (le même avec www. devant),
example.com et www.example.com,
il est judicieux de rediriger ces autres domaines vers le domaine principal pour éviter des doublons
(même entre la version avec et sans www. devant).
Exemple :
Pour cela, l’idéal est de faire pointer tous les noms de domaines secondaires dans un dossier sur votre hébergement, qui contiendra une redirection permanente vers le bon nom de domaine, qui lui sera hébergé dans un autre dossier.
Néanmoins, il y a des hébergements qui ne vous offrent qu’un seul et même dossier racine. Dans ce cas, il faudra tout mettre dans le même fichier .htaccess, en employant par exemple la solution suivante basée encore sur la réécriture d’URLs :
.htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} !^exemple\.fr$ [NC] RewriteRule ^(.*)$ http://exemple.fr/$1 [R=301,L] </IfModule>
La ligne RewriteCond
permet d’appliquer une redirection si le nom de domaine utilisé n’est pas le favori (ici exemple.fr).
Ne pas oublier le !^
avant le nom de domaine, le $
après, et un \
devant les .
(points).
La ligne suivante RewriteRule
applique une redirection 301 permanente.
Cette deuxième méthode, plus simple mais bien moins propre et efficace, utilise les documents HTML eux-mêmes, pour indiquer leur déplacement.
Cette méthode ne devrait être utilisée que lorsque les redirections HTTP sont impossibles.
Elle peut aussi être utilisée conjointement aux redirections Apache dans le cas de serveurs du style de
celui de Multimania.
page1.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR" lang="fr-FR"> <head> <meta charset="UTF-8" /> <meta http-equiv="Refresh" content="0; url=http://nouvelle.adresse.fr/dossier2/page2.html" /> <title>Redirection</title> <meta name="robots" content="noindex" /> </head> <body> <p><a href="http://nouvelle.adresse.fr/dossier2/page2.html">Redirection</a></p> </body> </html>
Vous trouverez plus d’informations dans ma documentation sur les entêtes et les META informations en HTML.
Prenez garde de ne pas laisser le titre originel, ni de texte, de ne pas oublier la balise robots
et de changer vers la nouvelle adresse aux deux endroits :
dans les entêtes avec refresh
et dans le corps du document avec le lien.
Ne pas mettre de redirection ou autre code Javascript, cela n’apporte rien et peut causer des problèmes.
Avec cette méthode, vous devez modifier chacune des pages de l’ancienne adresse. Si vous changez d’hébergeur, il faut donc conserver toutes les anciennes pages, et remplacer leur contenu par quelque chose de similaire à l’exemple ci-dessus.
Utilisez un délai de 0 secondes (comme dans l’exemple) ou une valeur très courte si vous souhaitez faire une redirection permanente (comme 301). Voir à ce sujet les explications de Yahoo!.
Le PHP
est un langage de programmation côté serveur.
En cas de déplacement d’une page PHP,
il vaut mieux utiliser la redirection Apache mais il peut être utile de voir une autre solution.
Le fichier PHP peut être conservé, en remplaçant son contenu par une véritable redirection HTTP.
Selon la norme HTTP,
il faut aussi fournir une redirection HTML.
Voir aussi mon script de de redirection HTTP gérée par une page d’erreur 404 personnalisée.
Ces redirections PHP peuvent être utilisées conjointement aux redirections Apache dans le cas de serveurs du style de celui de Multimania.
page1.php <?php //L’ordre des 3 lignes suivantes est important pour que cela marche sous un maximum de //différentes versions et configurations de PHP et de serveurs (en particulier IIS) //mais vous pouvez être amené à devoir utiliser différents ordres de ces trois lignes //ou supprimer la ligne 2 ou 3 sur certaines configurations header('Location: http://nouvelle.adresse.fr/dossier2/page2.php'); //Adresse de la nouvelle page header('HTTP/1.1 301 Moved Permanently'); //Code HTTP de redirection permanente header('Status: 301 Moved Permanently'); //Doublon utile à certaines versions de PHP et serveurs, surtout en CGI header('Content-Type: text/html; charset=UTF-8'); ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8" /> <meta http-equiv="refresh" content="0; url=http://nouvelle.adresse.fr/dossier2/page2.php" /> //Redirection HTML <title>Redirection</title> <meta name="robots" content="noindex" /> </head> <body> <p><a href="http://nouvelle.adresse.fr/dossier2/page2.php">Redirection</a></p> </body> </html>
Ici, il y a donc 3 endroits à modifier avec la nouvelle adresse.
Attention de ne pas envoyer le moindre texte au navigateur avant la fin des méthodes header()
;
pas d’espace en début de fichier avant la balise <?php
par exemple.
Les scripts PHP font parfois usage de paramètres dans la partie de l’adresse URL réservée pour les requêtes.
Lors des redirections, celles-ci doivent généralement être conservées.
Les redirections Apache conservent nativement ces paramètres.
Voici comment faire en PHP, avec un script de même usage mais plus général que le script PHP précédant
page1.php <?php $nouvelleAdresse='http://nouvelle.adresse.fr/dossier2/page2.php'; //Nouvelle adresse if (isset($_SERVER['QUERY_STRING'])&&($_SERVER['QUERY_STRING']!='')) $nouvelleAdresse.='?'.substr($_SERVER['QUERY_STRING'],0,2048); //Récupère les paramètres header('Location: '.$nouvelleAdresse); //Redirection HTTP header('HTTP/1.1 301 Moved Permanently'); header('Status: 301 Moved Permanently'); header('Content-Type: text/html; charset=UTF-8'); $nouvelleAdresse=htmlspecialchars($nouvelleAdresse,ENT_QUOTES); //Encode les caractères HTML spéciaux echo '<!DOCTYPE html>'."\n", '<html xmlns="http://www.w3.org/1999/xhtml">'."\n", '<head>'."\n", '<meta charset="UTF-8" />'."\n", '<meta http-equiv="refresh" content="0; url='.$nouvelleAdresse.'" />'."\n", //Redirection HTML '<title>Redirection</title>'."\n", '<meta name="robots" content="noindex" />'."\n", '</head>'."\n", "\n", '<body>'."\n", '<p><a href="'.$nouvelleAdresse.'">Redirection</a></p>'."\n", '</body>'."\n", '</html>'."\n";
Ici, un seul endroit à modifier (2ème ligne du script) pour donner la nouvelle adresse.
Voir ma documentation sur les requêtes HTTP conditionnelles en PHP pour d’autres utilisations des entêtes HTTP en PHP.
Les entêtes HTTP, bien qu’invisibles pour l’utilisateur final, sont autant importantes qu’un code HTML soigné. Les redirections permanentes n’en sont qu’une partie. Il est très utile de pouvoir afficher les entêtes HTTP dans votre navigateur pour vérifier votre code :
livehttpheaders
.livehttpheaders
sous MozillaVoici une liste de problèmes classiques.
Problème : Vous ne savez pas comment créer et/ou nommer ce fameux fichier .htaccess sur votre ordinateur.
Solution : Il s’agit d’un fichier texte. Il doit donc être créé avec un éditeur de texte tel le bloc-notes, et pas un traitement de texte comme Word. Si votre système d’exploitation vous empêche de nommer ce fichier .htaccess car il commence par un point, vous pouvez lui donner un nom temporaire, et le renommer avec votre logiciel FTP une fois transféré sur le serveur.
Sous Windows, si vous créez votre fichier texte par exemple sous Bloc-notes (Notepad), au moment de le sauvegarder et de lui donner un nom, mettez ".htaccess" avec des guillemets autour.
Autre méthode sous Windows encore, vous pouvez outrepasser les restrictions par exemple en nommant temporairement votre fichier C:\temp.htaccess puis dans une console le renommer avec la commande suivante :
C:\>rename temp.htaccess .htaccess
Ce contenu est protégé par une licence
Creative Commons Paternité - Pas d’Utilisation Commerciale - Partage des Conditions Initiales à l’Identique 2.0 France "BY-NC-SA (FR)"