Base de connaissances / Knowledge base

Redirections HTTP (13.03.12)
Une redirection c'est une URI (ou URL c'est pareil) qui renvoie à une autre URI pour que le client ait une réponse. Plusieurs type de redirections coexistent.
Les redirections sont, du point de vue du protocole HTTP, des codes de réponse commençant par un '3'.

On connaît tous le code 404 qui signifie 'Pas trouvé'. Voyons les deux cas principalement utilisés dans le cadre de la programmation d'un site:

Attention, les redirections 301 et 302 ne sont pas destinées à masquer l'adresse de destination. Les utilisateurs seront déviés vers l'adresse de destination, et c'est l'adresse de destination qui apparaitra dans la barre d'adresse.

NB: Cela a été testé sur apache; pour d'autres serveurs web, faut voir.

« 301 Permanent Redirect »

Ce code signifie Moved Permanently. Autrement dit 'la page que vous cherchez a une nouvelle URI définitive'. On l'utilise surtout dans le cas où un site web a été refait et dont certaines URI ne sont plus valables. Par exemple, un site avait auparavant www.lesite.ch/webmail/ mais désormais ce service est sur webmail.monsite.ch. Afin que les gens qui ont un marque-page sur l'ancienne URI le trouve encore, on met en place un script dans www.lesite.ch/webmail/ qui va rediriger vers webmail.monsite.ch. Selon le protocole, le navigateur doit afficher ensuite la nouvelle URI dans la barre URI. C'est une invitation à noter le changement d'URI. Le script sur webmail.monsite.ch pourrait détecter que la personne vient depuis www.lesite.ch/webmail/ (avec un paramètre dans le header 'Location' par exemple) et afficher une alerte pour que le surfeur modifie son signet si on a le paramètre.

En PHP cela donnerait ça:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://webmail.monsite.ch/");
exit;
?>

Attention à bien mettre le / final de l'URI. De même l'URI devrait toujours être absolue et non relative.

Ou, avec un paramètre:

header("HTTP/1.1 301 Moved Permanently");
header("Location: http://webmail.monsite.ch/?from=olduri");
exit;
?>

Dans un fichier de config Apache (par exemple .htaccess), cela donnerait ceci:
Redirect 301 /webmail http://webmail.monsite.ch/


« 302 Temporary Redirect ».

Ce code signifie Found. Autrement dit, 'la page que vous cherchez est ailleurs'. La principale différence avec le 301 c'est que le 301 a la notion de changement permanent et il faut donc désormais utiliser la nouvelle URI. Avec le 302, le protocole recommande de conserver l'URI originale. Peut-être n'est-ce que temporaire; peut-être l'URI définitive sera différente. Notons qu'en PHP, un simple
header("Location: http://www.monsite.ch/");
Fait un 302 implicite. Tout comme un simple
Redirect /webmail http://webmail.monsite.ch/
dans Apache.

Buts et manières

Lors de l'établissement d'une redirection, le but peut être de:
  1. Faire en sorte que seul le FQDN soit changé:
    • http://www.truc.com/tralala/ -> http://www.autretruc.com/tralala/
    • En ce cas, il suffira de mettre dans un fichier .htaccess à la racine du site:
      • Redirect 301 / http://www.autretruc.com/
  2. Faire en sorte que toute URL n'étant pas au bon FQDN renvoie vers la homepage du FQDN principal:
    • http://www.truc.com/tralala/ -> http://www.autretruc.com/
    • En ce cas, une redirection avec ré-écriture d'URL est à utiliser, tel que:
      • RewriteEngine on
      • RewriteCond %{HTTP_HOST} www\.truc\.com$   [NC]
      • RewriteRule (.*) http://www.autretruc.com/ [R=301,L]
    • Notons que l'on peut aussi récupérer le chemin, avec $1. Ceci aura le même effet que le point 1 :
      • RewriteEngine on
      • RewriteCond %{HTTP_HOST} www\.truc\.com$   [NC]
      • RewriteRule (.*) http://www.autretruc.com/$1 [R=301,L]
D'une manière générale, préférer la ré-écriture d'URL, plus souple et plus claire.

Google & Co


En l'état actuel des connaissances (octobre 2007), il est de loin préférable de mettre des 301 que des 302 afin que Google (et autres) ne perdent pas l'indexation déjà aquise sur l'autre URL.