Les redirections 301 : l'aspect technique

Les redirections 301 : l’aspect technique

A l’occasion d’un précédent billet, nous avons évoqué l’aspect purement SEO des redirections 301, et comment mettre en place des redirections portant pleinement leurs fruits en termes de référencement naturel. A l’occasion de ce nouvel article, écrit par Amandine Aupetit-Danteny, nous allons découvrir l’approche technique des redirections 301.


Les différents codes de redirection HTTP

Comme nous l’avons évoqué dans le billet intitulé « Redirections 301 et référencement naturel« , il existe plusieurs codes de redirections HTTP. Ces codes débutent par le chiffre 3.

Les codes les plus souvent utilisés sont les suivants :

  • Code 301 : ce code signifie que la page demandée n’existe plus, et ne sera plus accessible. Ce code sert aussi à indiquer que la ressource demandée est accessible à un autre adresse. La nomenclature RFC2616 précise qu’en plus de la redirection, la page doit contenir un court message précisant que la ressource demandée n’est plus accessible
  • Code 302 : ce code indique que la page n’est plus accessible de façon temporaire.

Les trois codes serveurs suivants, sont quant à eux plus rarement utilisés. Nous leur préférerons l’utilisation des redirections 301 et 302 :

  • 300 :  Multiple Choices : L’URI demandée se rapporte à plusieurs ressources
  • 303 :  See Other  : La réponse à cette requête est ailleurs
  • 307 :  Temporary Redirect  : La requête doit être redirigée temporairement vers l’URI spécifiée.

Comment réaliser une redirection :

Il existe plusieurs méthodes pour réaliser des redirections Web. Cependant, la meilleure semble être celle qui utilise les en-têtes HTTP pour indiquer au navigateur et moteurs de recherche que la ressource demandée a été déplacée.

Afin de pouvoir tester les différents types de redirections, un espace de test a été créé à cette adresse : http://amandine.aupetit.info/tests/redirections/

Les redirections Apache

Pour rediriger une page vers une autre avec Apache, le module mod_alias doit être préalablement installé. Nous préférerons l’utilisation de ce module à mod_rewrite qui est à réserver pour des cas plus complexes.

La syntaxe à mettre en oeuvre dans le .htaccess sera donc la suivante

Redirect redirect_code /path/old_page /path/new_page

Afin de tester ce type de redirection, vous pouvez vous rendre dans l’espace de test et cliquer sur le fichier   apacheredirect.html . La redirection fonctionnera alors et le navigateur vous conduira à la page finalpage.html

Nous avons en effet mis en oeuvre l’instruction suivante :

Redirect 301 /tests/redirections/apacheredirect.html /tests/redirections/finalpage.html

Voici ce que le client, navigateur internet ou crawler va donc recevoir comme instruction  (pour ce test, nous avons utilisé Telnet, nous verrons en fin d’article qu’il existe d’autres applications permettant d’obtenir les codes retournés par les serveurs) :

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/apacheredirect.html HTTP/1.1
Host: amandine.aupetit.info
HTTP/1.1 301 Moved Permanently
Date: Sun, 01 Jul 2012 14:09:22 GMT
Server: Apache/2.2.14 (Ubuntu)
Location: http://amandine.aupetit.info/tests/redirections/finalpage.html
Vary: Accept-Encoding
Content-Length: 357
Content-Type: text/html; charset=iso-8859-1
301 Moved Permanently
<h1>Moved Permanently</h1>
The document has moved <a href=”http://amandine.aupetit.info/tests/redirections/finalpage.html”>here</a>.
<hr />
<address>Apache/2.2.14 (Ubuntu) Server at amandine.aupetit.info Port 80</address>
</body></html>

La première partie de cette réponse est le header HTTP. nous constatons qu’il a bien retourné les informations suivantes :

  • HTTP/1.1 301 Moved Permanently : le code HTTP indiquant que le code de redirection
  • Location: http://amandine.aupetit.info/tests/redirections/finalpage.html :  l’adresse de la page de destination.

Voici les résultats affichés par Telnet lors de l’arrivée sur la page redirigée ( finalpage)  :

 

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/finalpage.html HTTP/1.1
Host: amandine.aupetit.info

HTTP/1.1 200 OK
Date: Sun, 01 Jul 2012 14:12:50 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Sun, 01 Jul 2012 13:49:44 GMT
ETag: “fc0b1e-1f-4c3c4f42aea8e”
Accept-Ranges: bytes
Content-Length: 31
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug
You have been redirected here

Le code HTTP est « 200 OK » ce qui signifie que la ressource demandée existe et est affichée.

Les redirections PHP

Dans notre exemple, nous avons choisi de mettre en place une redirection en PHP : d’autres langages de programmation dynamiques auraient pu être utilisés.

Voici la syntaxe PHP utilisée pour effectuer une redirection :

Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: finalpage.html" );

Voici les résultats affichés par Telnet lors de l’appel de la page à rediriger :

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/phpredirection.php HTTP/1.1
Host: amandine.aupetit.info
HTTP/1.1 301 Moved Permanently
Date: Sun, 01 Jul 2012 14:18:34 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.15
Location: finalpage.html
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html

Il est à noter que si la première ligne de la syntaxe est oubliée, le code HTTP retourné n’est plus un code 301, mais un code « 302 Found ». Cependant le « Location » ne change pas et la redirection est tout de même effectuée, comme le montre le résultat Telnet suivant :

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/phpredirection.php HTTP/1.1
Host: amandine.aupetit.info
HTTP/1.1 302 Found
Date: Sun, 01 Jul 2012 14:19:03 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.15
Location: finalpage.html
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html

La principale différence que nous noterons entre cette redirection PHP et la redirection Apache est que cette redirection n’est pas fidèle aux consignes édictées par la RFC et que nous mentionnions au début de cet article.

Les redirections HTML :

Pour réaliser une redirection HTML, le fichier à rediriger doit contenir la syntaxe suivante :

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<meta http-equiv=”refresh” content=”0;url=finalpage.html”>
</head>
<body>
You’re going to be redirected…
</body>
</html>

 

Notre fichier de test est accessible à cette adresse  : http://amandine.aupetit.info/tests/redirections/htmlredirect.html

Voici les résultats affichés par Telnet :

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/htmlredirect.html HTTP/1.1
Host: amandine.aupetit.info
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2012 14:43:45 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Sun, 01 Jul 2012 14:42:03 GMT
ETag: “fc0b2b-d0-4c3c5af468b8e”
Accept-Ranges: bytes
Content-Length: 208
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<meta http-equiv=”refresh” content=”0;url=finalpage.html”>
</head>
<body>
You’re going to be redirected…
</body>
</html>

 

A l’appel de la page à rediriger, le code retourné au client va donc être être un code « 200 OK », et ce n’est qu’après avoir chargé toute la page que le client sera redirigé vers la page de destination.

Outre le fait d’être une redirection excessivement longue (qui impose le chargement complet de la page à rediriger), à aucun moment le code 301 de redirection n’est utilisé.

Les redirections Javascript

Alors que la redirection HTML fait appel à une balise Meta, la redirection Javascript fait appel à une portion de code qui est la suivante :

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<script type=”text/javascript”>
<!–
window.location = “finalpage.html”
//–>
</script>
</head>
<body>
You’re going to be redirected…
</body>
</html>

 

Ce code a été mis en oeuvre sur la page de test suivante : http://amandine.aupetit.info/tests/redirections/javascriptredirect.html

Voici le résultat retourné par Telnet :

$ telnet amandine.aupetit.info 80
Trying 88.190.40.18…
Connected to hosting.yellow-sub.net.
Escape character is ‘^]’.
GET /tests/redirections/javascriptredirect.html HTTP/1.1
Host: amandine.aupetit.info
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2012 14:52:35 GMT
Server: Apache/2.2.14 (Ubuntu)
Last-Modified: Sun, 01 Jul 2012 14:49:50 GMT
ETag: “fc0b30-f9-4c3c5cb1bca10″
Accept-Ranges: bytes
Content-Length: 249
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<script type=”text/javascript”>
<!–
window.location = “finalpage.html”
//–>
</script>
</head>
<body>
You’re going to be redirected…
</body>
</html>

Ce type de redirection présente quelques contraintes :

  • seul le code HTTP 200 est retourné au client
  • ce type de traitement de redirection est particulièrement long, car il impose le chargement intégral de la page avant d’être traité
  • certains navigateurs ne prennent pas en charge le Javascript

Comment connaître les codes HTTP retournés par le serveur

Les codes HTTP, et plus particulièrement les codes de redirection vont avoir un impact important sur le référencement. Il est donc important de pouvoir les collecter et les analyser.

Pour cela, il existe une multitude d’outils à la disposition des référenceurs et SEO Managers. Parmi ces outils nous pouvons mentionner :