par Alexandre Alapetite le 2003-09-24 ; mise à jour 2013-06-15

Redirection Web en HTTP et HTML

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.


Sommaire

Quitter

Redirection HTTP avec Apache

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.

Le fichier Apache .htaccess

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.


Multimania, ou un exemple de cas où il faut garder les anciens fichiers

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é).


Erreurs dans le fichier .htaccess

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.

Sommaire

Changement permanent de nom de domaine

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.

Sommaire

Déplacement définitif d’un répertoire

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
Sommaire

Déplacement définitif d’une page ou d’un document

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
Sommaire

Suppression définitive d’une page ou d’un document

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/
Sommaire

Changement d’extension ou de type de fichier

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)

Sommaire

Redirection temporaire

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.

Sommaire

Déplacement avancé d’un répertoire

Il est souvent nécessaire de plus personnaliser la redirection d’un répertoire. Voici quelques cas.

Suppression d’un ensemble de documents avec redirection

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é.


Redirection de la racine

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>

Sans tenir compte de la casse

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

Déplacement d’un répertoire sauf certains fichiers

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

Déplacement d’un répertoire sans ses sous-répertoires

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

Déplacement d’un répertoire sans les fichiers existants

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>
Sommaire

Redirection pour noms de domaines multiples sur le même hébergement

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.

Sommaire

Redirection en HTML

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!.

Sommaire

Redirection en PHP

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.


Redirection en PHP avec des paramètres

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.

Sommaire

Conclusion

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 :

Fenêtre de l’extension livehttpheaders sous Mozilla
[livehttpheaders]

FAQ

Voici une liste de problèmes classiques.

Créer un fichier .htaccess

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

Licence

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)" [Creative Commons License]


Commentaires

object : Voir les commentaires

http://alexandre.alapetite.fr

Retour