Les redirections HTTP

La redirection d’URL est une technique qui permet de manière générale de donner plusieurs URL à une même ressource.

Il existe différents types de redirections (redirections temporaires, permanentes, etc.) qui servent différents objectifs et les redirections peuvent être faites de différentes manières : en utilisant HTTP, en HTML ou encore avec JavaScript.

Dans cette leçon, nous étudierons uniquement les redirections HTTP. Notez qu’il est recommandé d’utiliser HTTP pour effectuer une redirection plutôt que HTML ou JavaScript.

 

Fonctionnement d’une redirection

Une redirection HTTP indique que l’agent utilisateur doit prendre des mesures supplémentaires pour répondre à la demande.

Voyons comment fonctionne une redirection concrètement. Pour cela, imaginons qu’un utilisateur demande à accéder à une ressource particulière en tapant une URL dans son navigateur. Le client (navigateur) effectue alors une requête HTTP au serveur pour lui demander la réponse en question.

Lorsque le serveur reçoit la requête, il essaie d’y répondre. Dans la réponse HTTP envoyée, il inclut un code de statut (ou « code d’état ») HTTP. Si le serveur est capable de répondre à la demande et envoie bien la ressource demandée, par exemple, il accolera un code de statut 200 (OK) à la réponse.

Si la ressource demandée est introuvable, il enverra un code de statut 404 (Not Found). Si une erreur interne au serveur survient, il renverra un code 5xx, etc.

Dans certains cas, cependant, le serveur va bien trouver la ressource demandée mais ne va pas la renvoyer immédiatement soit car celle-ci ne se trouve pas à l’URL indiquée mais ailleurs soit car elle peut être récupérée via un cache navigateur. Dans ce cas, il va renvoyer un code de statut 3xx.

En fonction du type de redirection, le client va alors choisir l’action la plus adaptée. Les grands types de redirections sont les suivants :

  • Les redirections qui indiquent que la ressource peut être disponible à un URI différent, tel que fourni par l’en-tête de réponse Location. C’est le cas pour les redirections 301 (Moved Permanently), 302 (Found) et 307 (Temporary Redirect) ;
  • Les redirections qui offrent un choix de ressources correspondantes, chacune capable de représenter la cible de la requête d’origine. C’est le cas pour le code de statut 300 (Multiple Choice) ;
  • Les redirections vers une ressource différente, identifiée par l’en-tête de réponse Location, qui peuvent représenter une réponse indirecte à la requête, comme dans le cas du code de statut 303 (See Other) ;
  • Les redirections vers un résultat précédemment mis en cache, comme c’est le cas pour le code d’état 304 (Not Modified).

 

Les types de redirections HTTP en détail

Les redirections HTTP sont représentées par les codes de statut 3xx. Chaque code de statut HTTP 3xx représente un type de redirection différent.

300 Multiple Choice

Le code de statut 300 indique que la ressource cible possède plus d’une représentation possédant chacune un identifiant (généralement une URL) différent.

Des informations sur les alternatives sont fournies afin que le client puisse sélectionner une représentation préférée en redirigeant sa requête vers un ou plusieurs de ces identifiants.

En d’autres termes, le serveur souhaite que l’agent utilisateur s’engage dans une négociation réactive pour sélectionner la ou les représentations les plus appropriées à ses besoins.

Si le serveur a un choix préféré, le serveur devrait générer un champ d’en-tête Location contenant la référence (sous forme d’URI) relative à ce choix.

301 Moved Permanently

Le code de statut indique que la ressource cible a reçu un nouvel URI permanent et que toute référence future à cette ressource doit utiliser ce nouvel URI.

Concrètement, cela signifie que la ressource demandée est désormais disponible à un autre URI. La redirection 301 est certainement la redirection la plus courante. En effet, on l’utilise lorsqu’on modifie définitivement l’URL d’une page par exemple afin de rediriger les visiteurs qui utiliseraient l’ancienne URL vers la nouvelle (le nouvel emplacement où se trouve la page).

Le serveur devrait générer un champ d’en-tête Location dans la réponse contenant une référence URI préférée pour le nouvel URI permanent.

Dans la majorité des cas, lorsque l’agent utilisateur reçoit une réponse 301, il effectue une nouvelle requête avec le nouvel URI fourni par l’en-tête Location.

Notez qu’originellement la méthode de la nouvelle requête devrait être la même que celle de la précédente. Cependant, historiquement, les agents utilisateurs ont souvent implémenté cela incorrectement notamment dans la cas où la première requête était une requête POST (qui était souvent transformée en une requête GET).

Il est donc aujourd’hui admis qu’un agent utilisateur peut changer la méthode de demande de POST à GET d’une requête à l’autre. Un nouveau code de statut, le code 308 a d’ailleurs été créé pour spécifier explicitement qu’on ne veut pas que l’agent utilisateur change de méthode de requête lorsqu’il suit une redirection permanente.

302 Found

Le code d’état 302 indique que la ressource cible réside temporairement sous un URI différent.

Ce code de statut est le code à utiliser lors de maintenances par exemple ou lorsqu’on modifie une page et qu’on ne souhaite pas que les visiteurs puissent accéder à celle-ci pendant qu’elle est modifiée.

Comme la redirection n’est que temporaire, le client doit continuer à utiliser l’URI de requête de base pour les demandes futures. En effet, une redirection temporaire a pour finalité de disparaitre.

Comme pour une redirection 301, le serveur devrait générer un champ d’en-tête Location dans la réponse contenant une référence URI préférée pour le nouvel URI permanent.

La prise en charge des 302 par les agents utilisateur a été similaire à celle des 301 historiquement, avec ces agents utilisateur modifiant la méthode de requête entre deux requêtes alors que cela était théoriquement incorrect.

Comme précisé précédemment, il est aujourd’hui admis qu’un agent utilisateur peut changer la méthode de demande de POST à GET d’une requête à l’autre. Un autre code de statut, le code 307 a été mis en place pour spécifier explicitement qu’on ne veut pas que l’agent utilisateur change de méthode de requête lorsqu’il suit une redirection temporaire.

303 See Other

Le code de statut 303 indique que le serveur redirige l’agent utilisateur vers une ressource différente, comme indiqué par un URI dans le champ d’en-tête Location, qui est destiné à fournir une réponse indirecte à la demande d’origine.

Ce code de statut est souvent utilisé comme résultat de requêtes POST et PUT.

En effet, imaginez qu’un utilisateur envoie des données via un formulaire. La méthode utilisée sera généralement POST. Cependant, on voudra rarement rediriger l’utilisateur au même endroit que les données sont envoyées après qu’il ait validé le formulaire. On va ici plutôt utiliser une 303 pour rediriger l’utilisateur vers l’URI qui nous intéresse (confirmation d’envoi, page principale du compte client, page d’accueil du site, etc.).

304 Not Modified

Le code de statut 304 indique que la ressource demandée n’a pas changé depuis la dernière requête de récupération du client et que celui-ci peut donc utiliser la réponse envoyée précédemment stockée dans son cache.

Pour bien comprendre comment fonctionne et l’intérêt de ce code de statut, il faut avant tout comprendre comment le cache HTTP fonctionne.

Lorsqu’un agent utilisateur reçoit une réponse à une requête HTTP depuis le serveur, il peut cacher cette réponse, c’est-à-dire la sauvegarder localement dans le but de la réutiliser directement si le client effectue la même requête par la suite.

Dans certains cas, cependant, l’agent utilisateur va devoir recontacter le serveur pour s’assurer qu’il puisse utiliser la réponse cachée. C’est notamment le cas lorsque la durée de vie du cache est expirée.

Dans le cas où il n’y a pas eu de modification sur la ressource entre temps, le serveur peut alors renvoyer une 304 indiquant à l’agent utilisateur qu’il peut continuer d’utiliser la réponse mise en cache. Cela permet d’économiser des ressources car il y a moins de données transférées.

305 Use Proxy

Code de statut déprécié qui indiquait que la requête doit être ré-adressée au proxy.

306 Switch Proxy

Code de statut réservé et plus utilisé aujourd’hui qui indiquait que les requêtes suivantes doivent utiliser le proxy spécifié.

307 Temporary Redirect

Le code de statut 307 est équivalent au code 302 et indique donc que la ressource cible réside temporairement sous un URI différent.

La seule différence entre les codes de statut HTTP 302 et 307 est que le code 307 permet d’indiquer explicitement que l’agent utilisateur ne doit pas changer la méthode de demande s’il effectue une redirection automatique vers cet URI.

308 Permanent Redirect

Le code de statut 308 est équivalent au code 301 et indique donc que la ressource cible réside de manière permanente sous un URI différent.

La seule différence entre les codes de statut HTTP 301 et 308 est que le code 308 permet d’indiquer explicitement que l’agent utilisateur ne doit pas changer la méthode de demande s’il effectue une redirection automatique vers cet URI.

 

Redirections et SEO

En pratique, les redirections les plus couramment utilisées sont les redirections 301 et 304 et ces deux types de redirections HTTP sont principalement utilisées dans une optique SEO.

Les redirections 301 (et 308) permettent de transmettre l’autorité d’une URI à une autre pour les mots clefs sur lesquels elle est positionnée.

En effet, mettre en place une redirection 301 permet aux robots de Google de comprendre qu’une ressource en particulier a changé d’emplacement et donc de conserver les classements obtenus. Attention cependant : cela ne va bien fonctionner que si la nouvelle URI possède bien un contenu similaire à l’ancienne.

En plus de cela, le redirections 301 permettent de ne pas perdre les liens externes obtenus (qui sont un facteur d’optimisation du référencement essentiel) sur l’ancienne URI puisque leur autorité va donc également être « redirigée » vers la nouvelle URI.

Les redirections 304 permettent également d’optimiser son référencement en optimisant la vitesse d’affichage des pages d’un site pour les visiteurs puisque ce type de redirections permet de faire l’économie du transfert d’un certain poids de données.

 

Paramétrer des redirections HTTP en pratique

En tant que développeur / webmaster, vous n’aurez généralement pas à mettre en place un système de redirections 304 par vous-même car la plupart des hébergeurs s’occupent de cela.

En revanche, vous allez être souvent amené à créer des redirections 301, 302, etc. Il est donc important de savoir le faire.

Les redirections HTTP vont être mises en place au niveau du serveur. La façon de procéder va donc être différente selon que votre serveur soit un serveur Apache ou Nginx (ou autre).

Avec un serveur Apache (type de serveur le plus commun), vous pouvez définir des redirections soit dans le fichier de configuration du serveur, soit dans le fichier .htaccess de chaque répertoire.

Pour créer une redirection 301, par exemple, il va alors suffire d’utiliser une directive Redirect comme ceci :

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

Ici, on demande à rediriger l’URL http://example.com (la racine du site, symbolisée par /) vers http://www.example.com.

Notez qu’on aurait aussi bien pu écrire :

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

Pour rediriger une URL vers une image « image1.jpg » contenue dans un dossier images lui-même situé à la racine vers une autre URL « image2.jpg », on pourra écrire :

Redirect 301 /images/image1.jpg http://www.example.com/images/image2.jpg

Avec un serveur nginx, on pourra créer un bloc server{} contenant nos redirections ou de manière plus classique utiliser une directive rewrite comme cela :

rewrite ^/images/(.*)$ http:// example.com/photos/$1 redirect;.

Cela redirigera tous les documents du dossiers images vers un autre dossier photos. Ici, vous pouvez noter l’emploi de plusieurs signes. Ces signes sont des métacaractères d’un langage appelé expressions régulières : ils possèdent une signification spéciale et permettent donc de préciser la règle de redirection.