Tutoriel : Redirection Web HTTP, PHP et HTML

Publié le 04 octobre 2010 par Capmarketer

Sommaire

  • Introduction
  • Sommaire
  • Redirection HTTP avec Apache
    • Le fichier Apache .htaccess
      • Multimania, ou un exemple de cas où il faut garder les anciens fichiers
      • Erreurs dans le fichier .htaccess
    • Changement permanent de nom de domaine
    • Déplacement définitif d’un répertoire
    • Déplacement définitif d’une page ou d’un document
    • Suppression définitive d’une page ou d’un document
    • Changement d’extension ou de type de fichier
    • Déplacement d’un répertoire sans ses sous-répertoires
    • Redirection temporaire
    • Redirection pour noms de domaines multiples sur le même hébergement
  • Redirection en HTML
  • Redirection en PHP
    • Redirection en PHP avec des paramètres
  • Conclusion
  • FAQ

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.

Nous allons détailler la redirection HTTP sous Apache, un des serveurs Web les plus répandus, en nous basant sur la documentation officielle des alias Apache, et sur la référence des codes HTTP.

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 en mode ASCII sur votre serveur Web.

Attention aussi aux slashs / car tous les caractères sont importants !

Au moins le fichier .htaccess à la racine de votre serveur devrait contenir la déclaration

<Files .htaccess> ou similaire pour la sécurité (4 premières lignes de l’exemple ci-dessous).

Les différentes parties de cet exemple seront expliquées plus tard.

.htaccess
<Files .htaccess>
	order allow,deny
	deny from all
</Files>
<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 :

  • Les adresses d’origine commencent par un slash et contiennent l’adresse depuis la racine du serveur.
  • Les adresses de destination commencent par un protocole, comme http://

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

C’est conseillé, 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.

Exemples :

  • http://ancienne.adresse.fr vers http://nouvelle.adresse.fr
  • http://ancienne.adresse.fr/page.html vers http://nouvelle.adresse.fr/page.html
  • http://ancienne.adresse.fr/dossier/document.pdf vers http://nouvelle.adresse.fr/dossier/document.pdf

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) :

  • http://adresse.actuelle.fr/dossier1/ vers http://adresse.actuelle.fr/dossier2/
  • http://adresse.actuelle.fr/dossier1/page1.html vers http://adresse.actuelle.fr/dossier2/page1.html
  • http://adresse.actuelle.fr/dossier1/document1.pdf vers http://adresse.actuelle.fr/dossier2/document1.pdf
  • http://adresse.actuelle.fr/dossier1/sousdossier1/ vers http://adresse.actuelle.fr/dossier2/sousdossier1/
  • http://adresse.actuelle.fr/dossier1/sousdossier1/page2.html vers http://adresse.actuelle.fr/dossier2/sousdossier1/page2.html

À 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 :

  • http://adresse.actuelle.fr/page3.html vers http://adresse.actuelle.fr/page4.html
  • http://adresse.actuelle.fr/dossier3/document2.pdf vers http://adresse.actuelle.fr/dossier4/document3.pdf

Cette fois ci, cela nécessite une ligne particulière pour chaque document.

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

  • http://adresse.actuelle.fr/vieux.html
.htaccess
Redirect gone /vieux.html
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.

  • http://adresse.actuelle.fr/document4.doc vers http://adresse.actuelle.fr/document4.pdf
.htaccess
Redirect seeother /document4.doc http://adresse.actuelle.fr/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.
  • http://adresse.actuelle.fr/images/10.jpg vers http://adresse.actuelle.fr/images/10.gif
  • http://adresse.actuelle.fr/images/11.jpg vers http://adresse.actuelle.fr/images/11.gif
.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, et cela ne va pas être plus détaillé ici.

Sommaire

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

Avec une technique similaire, voyons comment rediriger les fichiers d’un répertoire, mais pas des sous-répertoires.

Exemple :

  • http://adresse.actuelle.fr/dossier1/ vers http://adresse.actuelle.fr/dossier2/
  • http://adresse.actuelle.fr/dossier1/page1.html vers http://adresse.actuelle.fr/dossier2/page1.html
  • http://adresse.actuelle.fr/dossier1/sousdossier1/ vers http://adresse.actuelle.fr/dossier1/sousdossier1/
  • http://adresse.actuelle.fr/dossier1/sousdossier1/page2.html vers http://adresse.actuelle.fr/dossier1/sousdossier1/page2.html

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

Redirection de la racine

Un cas particulier plus simple est la redirection de la racine du site vers un sous répertoire :

  • http://adresse.actuelle.fr/ vers http://adresse.actuelle.fr/dossier1/

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

Exemples :

  • http://bonne.adresse.fr/telechargement/ vers http://votre.longue.adresse.fr/et_compliquee/
  • http://bonne.adresse.fr/telechargement/video.mpg vers http://votre.longue.adresse.fr/et_compliquee/video.mpg

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

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

Exemples :

  • http://example.com/ vers http://exemple.fr/
  • http://www.exemple.fr/ vers http://exemple.fr/
  • http://www.example.com/index.html vers http://exemple.fr/index.html

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

  • http://ancienne.adresse.fr/dossier1/page1.html vers http://nouvelle.adresse.fr/dossier2/page2.html
page1.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; 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,follow" />
</head>
<body>
<p><a href="http://nouvelle.adresse.fr/dossier2/page2.html">Redirection</a></p>
</body>
</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.

Ces redirections PHP peuvent être utilisées conjointement aux redirections Apache dans le cas de serveurs du style de celui de Multimania.

  • http://ancienne.adresse.fr/dossier1/page1.php vers http://nouvelle.adresse.fr/dossier2/page2.php
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
header('Content-Type: text/html; charset=UTF-8');
echo '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'; //entête XML
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; 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,follow" />
</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

  • http://ancienne.adresse.fr/dossier1/page1.php?param1=tic+tac&param2=truc%20toto vers http://nouvelle.adresse.fr/dossier2/page2.php?param1=tic+tac&param2=truc%20toto
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 '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'."\n", //Entête XML
 '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'."\n",
 '<html xmlns="http://www.w3.org/1999/xhtml">'."\n",
 '<head>'."\n",
 '<meta http-equiv="content-type" content="text/html; charset=UTF-8" />'."\n",
 '<meta http-equiv="refresh" content="0; url='.$nouvelleAdresse.'" />'."\n", //Redirection HTML
 '<title>Redirection</title>'."\n",
 '<meta name="robots" content="noindex,follow" />'."\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.

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.

Sous le navigateur Mozilla, une extension permet de visualiser les entêtes HTTP : très utile pour vérifier votre code.

Fenêtre de l’extension livehttpheaders sous Mozilla


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