Redirections sur un site web

Ces redirections supposent un serveur Apache et alors fonctionnent dans un fichier .htaccess. Celui-ci est placé à la racine du site et peut être surchargé dans les sous-répertoires. Des commandes PHP peuvent être utilisées également.

Sommaire

Redirection vs. réécriture d'URL

Il faut distinguer le principe de la redirection de celui de la réécriture d'URL. Ce sont deux techniques proches mais qui ont un effet opposé:

Redirection: l'URL donnée par l'utilisateur est redirigée sur une nouvelle page. L'URL de la nouvelle page est affichée par le navigateur.
On l'utilise pour un changement d'adresse. La nouvelle URL devrait être indexée par les moteurs de recherche et l'ancienne supprimée.

Réécriture: l'URL donnée par l'utilisateur est remplacée par le serveur de façon invisible par un nouveau chemin. Le navigateur affiche cependant l'URL donnée par l'utilisateur.
On l'utilise pour séparer l'URL visible du chemin réel et fournir aux utilisateurs des libellés plus pratiques. Seule l'URL visible doit être indexée par les moteurs de recherche et non pas le chemin sur le serveur.

Apache utilise le même module RewriteEngine dans les deux cas, mais la commande Redirect ou l'option 301 changent l'URL affichée. En fait le serveur renvoi la nouvelle URL au navigateur qui doit effectuer une nouvelle requête.

Les redirections doivent être placées avant les réécritures dans le fichier .htaccess.

Comment ajouter www

Comment rediriger http://example.fr sur http://www.example.fr ...

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example.fr
RewriteRule (.*) http ://www.example.fr/$1 [R=301,L]

HTTP_HOST représente le domaine donc la condition extrait le domaine de l'URL et le compare avec une chaîne qui commence par example.fr.
Et on fait une redirection 301 sur http://www.example.fr pour toutes les URL qui commencent par example.fr.

Comment renvoyer les erreurs 404 sur une page

Ce peut être une page d'erreurs, dite page 404 du nom du code renvoyé quand une page n'est pas trouvée, ou la page d'accueil (plus utile).

RewriteEngine  on
ErrorDocument 404 /index.php

Noter que la directive RewriteEngine on qui active les redirections se place une seule fois en début du fichier .htaccess.

Rediriger un nom de domaine sur un autre

Pour le changement définitif de nom de domaine, le nouveau domaine étant example.com ...

RewriteEngine  on
Redirect 301 / http://www.example.com/  

Toutes les pages seront redirigées sur de nouveaux fichiers de même nom mais sur le nouveau domaine.

Pour un changement temporaire, on utiliserait le code 302.

Avec PHP :

Pour rediriger un site sur un nouveau nom de domaine on peut utiliser le code suivant, dans un fichier index.php:

<?php 
   header("Status: 301 Moved Permanently"); 
   header("Location:http://www.example.com/"); 
?>

Pour le visiteur se sera comme s'il avait tapé l'URL du site de destination.

Pour une redirection temporaire, en PHP c'est plus simple, car c'est l'option par défaut, aussi il n'est pas nécessaire de préciser le statut:

<?php header("Location:http://www.example.com/"); ?> 

Rediriger la page d'accueil sur le nom du site

On veut qu'une URL comme http://www.example.com/index.html soit redirigée par le serveur sur http://www.example.com/ pour éviter que les robots des moteurs de recherche ne voient deux URL différentes là où il y a en une seule.

Dans ce cas, on utilisera la variable d'environnement REQUEST_URI de PHP qui indique quelle page à été demandée au serveur. Puis on utilise une commande de chargement, comme ci-dessous par exemple:

<?php
 if(eregi('index.(html|php)', $_SERVER['REQUEST_URI'])) 
 { 
  header('HTTP/1.1 301 Moved Permanently'); 
  header('Location: http://www.example.com/'); 
 } 
?>

On vérifie avec la fonction eregi que la page chargée est bien index.php ou index.html (ou tout autre nom) et dans ce cas seulement on effectue la redirection.

Une autre solution est de renommer la page d'accueil, en accueil.html par exemple, de l'indiquer au serveur avec la commande suivante dans .htaccess:

DirectoryIndex accueil.html

Redirection pour une page déplacée

Une page ayant été déplacée dans un nouveau répertoire, ou sous un nouveau nom (ou les deux), cette directive doit être donnée au serveur:

Redirect 301 /répertoire/page.html http://www.example.com/répertoire/page.html  

Que ce soit sur le même site ou sur un autre, le nom du site étant toujours inclus dans l'URL de destination et pas dans la source.

Rediriger un répertoire entier vers un seul fichier

Si l'on veut retirer un sous-répertoire du Web, on peut le rediriger en bloc sur la page d'accueil ou une autre page avec une seule directive:

RedirectMatch 301 ^/monsousrep/.*$ http://www.example.com/index.php

Le répertoire à supprimer se nomme "monsousrep" à remplacer par le nom de votre répertoire ainsi que le domaine de la cible, et la page.
La destination ne doit pas être contenue dans le répertoire à rediriger car cela ferait entrer dans un boucle infinie.

Sur le plan du référencement, une telle opération est pénalisante. Il est préférable de placer une page en "noindex" plutôt que la rediriger sur une autre page quand le contenu est différent.

Si vous optez pour la redirection, comme toujours, vous devez vous assurer que tous les liens pointant sur une page redirigée sont mis à jour. Un lien vers une redirection sur le même site est pénalisante.
Utilisez Link Checker avec les options -r -s -f pour trouver ces liens.

Pour en savoir plus sur les redirections dans le fichier .htaccess, consulter le Manuel Apache.