Redirections en HTTP

La redirection d'URL est une technique pour donner à une page, un formulaire ou une application Web entière, plus d'une adresse. HTTP fournit un type particulier de réponses, les redirections HTTP, pour effectuer cette opération utilisée pour de nombreux objectifs : redirection temporaire pendant la maintenance du site, redirection permanente pour que les liens externes continuent de fonctionner après un changement d'architecture du site, pages de progression lors du téléchargement d'un fichier, etc.

Principe

En HTTP, une redirection est déclenchée par le serveur en envoyant des réponses spéciales à une requête : les redirections. Les redirections HTTP sont des réponses avec un code d'état de 3xx. Un navigateur, lorsqu'il reçoit une réponse de redirection, utilise la nouvelle URL fournie et la charge immédiatement : la plupart du temps, la redirection est transparente pour l'utilisateur, si ce n'est un petit impact de performance.

Il existe plusieurs types de redirections et elles se répartissent en trois catégories : les redirections permanentes, les temporaires et les spéciales.

Redirections permanentes

Ces redirections sont faites pour durer éternellement. Elles impliquent que l'URL d'origine ne doit plus être utilisée et que la nouvelle URL est préférée. Les robots des moteurs de recherche déclenchent une mise à jour de l'URL associée à la ressource dans leurs index.

Code Texte Traitement des méthodes Cas d'utilisation typique
301 Moved Permanently Requêtes GET inchangées.
Les autres peuvent être changés ou non en GET.[1]
Réorganisation d'un site Web.
308 Permanent Redirect Méthode et corps de la requête inchangés. Réorganisation d'un site Web, avec des liens/opérations non-GET.

[1] La spécification n'avait pas l'intention de permettre des changements de méthode, mais il y a en pratique des agents utilisateurs qui le font. 308 a été créé pour supprimer l'ambiguïté du comportement lors de l'utilisation de méthodes autres que GET.

Redirections temporaires

Parfois, la ressource demandée ne peut pas être accédée à partir de son emplacement standard, mais elle peut l'être à partir d'un autre endroit. Dans ce cas, une redirection temporaire peut être utilisée. Les robots des moteurs de recherche ne mémorisent pas le nouveau lien temporaire. Les redirections temporaires sont également utilisées lors de la création, de la mise à jour et de la suppression de ressources pour présenter des pages de progression temporaires.

Code Texte Traitement des méthodes Cas d'utilisation typique
302 Found Requêtes GET inchangées.
Les autres peuvent être changés ou non en GET.[2]
La page Web n'est temporairement pas disponible pour des raisons qui n'ont pas été imprévues. De cette façon, les moteurs de recherche ne mettent pas à jour leurs liens.
303 See Other Requêtes GET inchangées.
Les autres sont changées en GET (le corps est perdu).
Utilisé pour rediriger après un PUT ou un POST pour empêcher un rafraîchissement de la page qui redéclencherait l'opération.
307 Temporary Redirect Méthodes et corps inchangés La page Web n'est temporairement pas disponible pour des raisons qui n'ont pas été imprévues. De cette façon, les moteurs de recherche ne mettent pas à jour leurs liens. Mieux que 302 lorsque des liens/opérations non-GET sont disponibles sur le site.

[2] La spécification n'avait pas l'intention de permettre des changements de méthode, mais il y a en pratique des agents utilisateurs qui le font. 307 a été créé pour supprimer l'ambiguïté du comportement lors de l'utilisation de méthodes autres que GET

Redirections spéciales

En plus de ces redirections habituelles, il existe deux redirections spécifiques. Le 304 (Not Modified) redirige une page vers la copie mise en cache localement (qui était obsolète), et le 300 (Multiple Choice) est une redirection manuelle : le corps, présenté par le navigateur comme une page Web, liste les redirections possibles et l'utilisateur clique sur une pour la sélectionner.

Code Texte Cas d'utilisation typique
300 Multiple Choice Pas beaucoup : les choix sont listés dans une page HTML dans le corps du texte. Pourrait être servi avec un 200 OK status.
304 Not Modified Rafraîchissement du cache : ceci indique que la valeur dans le cache est encore correcte et peut être utilisée.

Autre façon de spécifier les redirections

Les redirections HTTP ne sont pas les seuls moyens de définir des redirections. Il existe deux autres méthodes: les redirections HTML en utilisant l'élément <meta>, et les redirections JavaScript en utilisant le DOM.

Redirections HTML

Les redirections HTTP sont le moyen privilégié de créer des redirections, mais parfois le développeur Web n'a pas le contrôle du serveur ou ne peut pas le configurer. Pour ces cas spécifiques, les développeurs Web peuvent créer une page HTML avec un élément <meta> et son attribut http-equiv avec la valeur refresh, positionné dans le <head> de la page. Lors de l'affichage de la page, le navigateur trouvera cet élément et ira à la page indiquée.

<head> 
  <meta http-equiv="refresh" content="0; URL=http://www.example.com/" />
</head>

L'attribut content commence avec un nombre indiquant combien de secondes le navigateur doit attendre avant de rediriger vers l'URL fournie. Toujours le mettre à 0, pour une meilleure accessibilité.

Bien entendu, cette méthode ne fonctionne qu'avec des pages HTML (ou similaires) et ne peut être utilisée pour des images ou tout autre type de contenu.

Notez que ces redirections cassent le bouton de retour dans un navigateur : vous pouvez revenir à une page avec cet en-tête mais mais vous serez de nouveau instantanément rediriger.

Redirections JavaScript

Les redirections en JavaScript se créent en définissant une valeur pour la propriété window.location et la nouvelle page est alors chargée.

window.location = "http://www.example.com/";

Comme les redirections HTML, cela ne fonctionne pas sur toutes les ressources, et évidemment, cela ne marchera que pour les clients qui exécutent du JavaScript. D'un autre côté, il y a plus de possibilités car vous ne pouvez déclencher la redirection que si certaines conditions sont remplies, par exemple.

Ordre de priorité

Avec trois possibilités de redirections d'URL, plusieurs méthodes peuvent être spécifiées en même temps, mais laquelle est appliquée en premier ? L'ordre de priorité est le suivant:

  1. Les redirections HTTP sont toujours exécutées en premier, alors même que la page n'est pas transmise, et ni même lue.
  2. Les redirections HTML (<meta>) sont exécutées are executed s'il n'y avait pas de redirections HTTP.
  3. Les redirections JavaScript sont utilisées en dernier recours, et uniquement si JavaScript est activé côté client.

Dans la mesure du possible, utilisez des redirections HTTP, et n'ajoutez pas d'élément <meta> de redirection. Si quelqu'un change les redirections HTTP et oublie de changer les redirections HTML, les redirections ne seront plus identiques, ce qui pourrait causer une boucle infinie ou d'autres cauchemars.

Cas d'utilisation

Il existe de nombreux cas d'utilisation pour les redirections, mais comme les performances sont affectées par chaque redirection, leur utilisation doit être réduite au minimum.

Alias de domaine

Idéalement, il n'y a qu'un seul emplacement, et donc qu'une seule URL pour une seule ressource. Mais il existe plein de raisons de vouloir des noms alternatifs pour une même ressource (plusieurs domaines, comme avec et sans le préfixe www ou des URLs plus courtes et faciles à retenir, ....). Dans ces cas, plutôt que de dupliquer la ressource, il est utile d'utiliser une redirection vers la vraie URL (canonique).

Un alias de domaine peut être fait pour plusieurs raisons:

  • Élargir la portée de votre site. Un cas courant est celui où votre site se trouve sous le domaine www.example.com et où l'accès à vos pages à partir de example.com devrait également être possible. Dans ce cas, des redirections vers www.example.com sont mises en place, pour les pages de example.com. Vous pouvez également fournir des noms synonymes couramment utilisés ou des fautes de frappe fréquentes de vos noms de domaine.
  • Passer à un autre domaine. Par exemple, votre société a été renommée et lorsqu'on recherche l'ancien nom, vous voulez que les gens habitués à l'ancien site Web de la société vous trouvent sous le nouveau nom.
  • Forcer HTTPS. Les requêtes vers la version HTTP non sécurisée de votre site seront redirigées vers la version HTTPS de votre site.

Maintenir les liens en vie

Lorsque vous restructurez des sites Web, les URL des ressources changent. Même si vous pouvez mettre à jour les liens internes de votre site Web pour qu'ils correspondent au nouveau schéma de nommage, vous n'avez aucun contrôle sur les URL utilisées par les ressources externes. Vous ne voulez pas briser ces liens, car ils vous apportent des utilisateurs précieux (et aident votre référencement), donc vous configurez des redirections depuis les anciennes URL vers les nouvelles.

Même si cette technique fonctionne également pour les liens internes, vous devriez éviter d'avoir des redirections internes. Une redirection a un coût significatif sur les performances (car une requête HTTP supplémentaire est faite) et si vous pouvez l'éviter en corrigeant les liens internes, vous devez corriger ces liens.

Réponses temporaires aux requêtes non sécurisées

Les requêtes Unsafe modifient l'état du serveur et l'utilisateur ne devrait pas les rejouer par inadvertance. Typiquement, vous ne voulez pas que vos utilisateurs you don't want your users to renvoient des requêtes PUT, POST ou DELETE. Si vous ne vous contentez que d'envoyer la réponse à la suite de cette requête, une simple clic sur le bouton de rechargement (éventuellement après un message de confirmation), renvoie la demande.

Dans ce cas, le serveur peut renvoyer une réponse 303 (See Other) qui contiendra les bonnes informations, mais si le bouton de rechargement est pressé, seule cette page est réaffichée, sans rejouer les demandes non sécurisées.

Réponses temporaires aux longues requêtes

Certaines requêtes peuvent nécessiter plus de temps sur le serveur comme parfois des requêtes DELETE qui sont planifiés pour un traitement ultérieur. Dans ce cas, la réponse est un 303 (See Other) qui renvoie à une page indiquant que l'action a été programmée, et informe éventuellement de l'avancement de l'action, ou permet de l'annuler.

Configuration des redirections dans les serveurs les plus courants

Apache

Les redirections peuvent être définies soit dans le fichier de configuration du serveur, soit dans le fichier .htaccess de chaque répertoire.

Le module mod_alias a des directives Redirect et RedirectMatch qui définissent une réponse 302 (par défaut):

<VirtualHost *:80>
	ServerName example.com
	Redirect / http://www.example.com
</VirtualHost>

L'URL http://example.com/ sera redirigée vers http://www.example.com/, ainsi que les fichiers ou répertoires qui s'y trouvent (http://example.com/index.html sera redirigée vers http://www.example.com/index.html)

RedirectMatch fait la même chose mais prend une expression régulière pour définir une liste d'URLs concernées:

RedirectMatch ^/images/(.*)$ http://images.example.com/$1

Tous les documents dans le répertoire images/ seront redirigés vers un autre domaine.

Si vous ne souhaitez pas configurer une redirection temporaire, un paramètre supplémentaire (soit le code d'état HTTP à utiliser, soit le mot clé permanent) peut être utilisé pour configurer un autre type de redirection:

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

Le module mod_rewrite peut également être utilisé pour créer des redirections. Il est plus flexible, mais un peu plus complexe à utiliser.

Nginx

Dans Nginx, vous créez un bloc server spécifique pour le contenu que vous voulez rediriger:

server {
	listen 80;
	server_name example.com;
	return 301 $scheme://www.example.com$request_uri;
}

Pour appliquer une redirection pour un dossier ou un sous-ensemble de pages uniquement, utilisez la directive rewrite:

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

IIS

Dans IIS, vous devez utiliser l'élément <httpRedirect> pour configurer les redirections.

Boucles de redirection

Les boucles de redirection se produisent lorsque lorsque les redirections se succèdent en suivant celle déjà effectuée. En d'autres termes, il y a une boucle qui ne terminera jamais et aucune page ne sera finalement trouvée.

La plupart du temps, il s'agit d'un problème de serveur, et si le serveur ne peut pas le détecter, il renvoie le message 500 Internal Server Error. Si vous rencontrez une telle erreur peu après avoir modifié une configuration de serveur, il s'agit probablement d'une boucle de redirection.

Parfois, le serveur ne le détecte pas : une boucle de redirection peut s'étendre sur plusieurs serveurs qui n'ont pas une vue globale de ce qui se passe. Dans ce cas, les navigateurs le détecteront et afficheront un message d'erreur. Firefox affichera:

Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas.

tandis que Chrome affichera:

Cette page Web présente une boucle de redirection

Dans les deux cas, l'utilisateur ne peut pas faire grand-chose (à moins qu'une corruption ne se produise de son côté, comme une inadéquation du cache ou des cookies).

Il est important d'éviter les boucles de redirection car elles perturbent complètement l'expérience utilisateur.