Redirection 301

Le terme 301 Redirect fait référence au transfert permanent d’une adresse Web vers une autre. Nous expliquons le contexte technique et montrons comment configurer Redirect 301 avec un fichier .htacess sur le serveur.

À quoi servent les 301 Redirects ?

301 Redirect est la méthode de transfert la plus connue. Ici, le chiffre 301 fait référence au code de statut HTTP dont il est question. Bien que le code de statut 404 indique que la ressource demandée est introuvable, les codes 300 font référence à des redirections, ou « redirects » en anglais. En général, les redirections 301 sont utilisées pour éviter les erreurs 404.

Faisons le tour des principaux codes de statut http associés aux redirections :

Code de statut HTTP Explication
200 OK La ressource à l’adresse interrogée est disponible en permanence à une nouvelle adresse renvoyée par le serveur. L’ancienne adresse n’est plus valide.
301 Moved Permanently La ressource à l’adresse interrogée est disponible en permanence à une nouvelle adresse renvoyée par le serveur. L’ancienne adresse n’est plus valide.
302 Found La ressource à l’adresse interrogée est temporairement disponible à une nouvelle adresse renvoyée par le serveur. L’ancienne adresse peut éventuellement être à nouveau valide à l’avenir.
303 See Other Similaire à 302, à la différence près que seules les requêtes GET sont autorisées lors de l’appel de l’adresse temporaire.
307 Temporary Redirect Similaire à 302 ; contrairement à 303, le client peut modifier la méthode HTTP (GET, POST, PUT, etc.) lors de l’appel de l’adresse temporaire.
404 Not Found Le serveur ne trouve aucune ressource à l’adresse interrogée.
### Redirection 301 pour migrer du contenu

Les contenus Web, que l’on désigne également comme des ressources, sont localisés sous des adresses Web. Parfois, les contenus sont migrés, c’est-à-dire que le contenu reste le même et que seule l’adresse change. Ceci peut être notamment le cas lors du passage de HTTP à HTTPS, du déplacement d’un site vers un nouveau domaine ou de l’ajustement de la structure de liens pour l’optimisation du référencement auprès d’un moteur de recherche. Dans tous les cas, on cherche à éviter que les utilisateurs accédant aux adresses existantes se retrouvent dans l’impasse.

Si le serveur ne peut pas associer de ressource à une adresse, il renvoie l’erreur HTTP 404 « Not Found ». Cela est ennuyeux pour les utilisateurs car ils ne peuvent pas accéder à la ressource souhaitée. Si l’adresse est accessible par uncrawler Web au lieu d’un humain, les erreurs 404 entraîneront la désindexation de la ressource associée. Les exploitants de site Web tentent d’éviter autant que possible ces deux scénarios.

### Redirection 301 pour l’optimisation du référencement auprès des moteurs de recherche

Mis à part les changements d’adresse des contenus Web, les 301 Redirects sont essentiels pour l’optimisation du référencement auprès des moteurs de recherche (SEO) et pour le marketing en ligne. Par exemple, les redirections 301 sont utilisées pour générer les URL adaptées aux moteurs de recherche et les « URL canoniques ». Les réducteurs d’URL eux aussi reposent en interne sur les redirections de type 301.

Pourquoi les 301 Redirects sont-ils si importants pour le SEO ? Contrairement aux redirections 302, 303 et 307 apparentées, seule la redirection 301 transfère le « Link Juice » ou « jus SEO » de l’adresse d’origine vers la nouvelle adresse. Si un moteur de recherche a indexé un contenu et l’a analysé comme positif, l’adresse peut être réinitialisée via une redirection 301 sans perdre sa note. Ainsi, les Redirects 301 permettent de mettre sur pied des stratégies de SEO complexes telles qu’une stratégie multidomaine.

Comment fonctionnent les 301 Redirects ?

Une redirection 301 intervient lors de l’échange entre les serveurs Web et les clients. Le serveur informe le client que la ressource demandée n’est plus disponible à l’adresse Web interrogée (URL) et transmet l’adresse qui est maintenant valide. Le client peut être à la fois le navigateur manipulé par un utilisateur humain et un robot de moteur de recherche.

  1. Le client tente d’accéder à la ressource sous l’URL.
  2. Le serveur répond en renvoyant le code de statut 301 « Moved Permanently » et transmet la nouvelle URL pour accéder à la ressource dans l’en-tête HTTP Location.
  3. Le client met en cache la nouvelle URL ; les accès futurs à l’ancienne URL accèderont immédiatement à la nouvelle URL.
  4. Le client tente d’appeler la ressource sous la nouvelle URL.

L’outil de réseau cURL populaire permet de visualiser le déroulement de ce processus. Nous allons à la page d’accueil de IONOS à http://ionos.fr et utilisons la méthode HTTP HEAD pour sortir l’en-tête de réponse :

curl --head http://ionos.fr

Le serveur IONOS répond avec le code de statut HTTP « 301 Moved Permanently », et l’en-tête Location contient la nouvelle adresse https://www.ionos.fr/. Comme nous l’observons, la page d’accueil se trouve sous le sous-domaine WWW et utilise le protocole HTTPS. Ensuite, nous demandons à cURL de suivre en plus la redirection 301 avec l’option Location :

curl --head --location http://ionos.fr

cURL sort maintenant les en-têtes de deux connexions. Lors du deuxième appel, le serveur répond avec le code de statut « 200 OK » ; la ressource a été trouvée, le contenu est transmis dans le corps de la réponse. Le même processus s’exécute en arrière-plan dans votre navigateur lorsque vous entrez l’adresse.

### Définir le redirect 301 avec le fichier .htaccess

Nous avons examiné le rôle que joue la redirection 301 dans l’échange entre le serveur et le client. Mais comment puis-je constater l’existence de 301 Redirects sur le serveur? Plusieurs approches existent pour cela : l’une des plus couramment utilisée consiste à définir des directives de redirection dans le fichier .htaccess du serveur Web Apache. Pour que cela fonctionne, les modules Apache correspondants doivent être actifs :

Directives Module Apache Explication
Redirect mod_alias Redirections simples
Rewrite mod_rewrite Transferts complexes
### Redirects simples pour la redirection 301 dans le .htaccess

Observons tout d’abord comment définir des Redirects simples de type 301 dans le fichier .htaccess. Pour ce faire, nous utilisons les directives Redirect du module mod_alias. Elles sont utiles dès lors qu’il s’agit de rediriger une URL sur le serveur vers une autre URL. La structure est d’une grande simplicité :

Redirect 301 "/source_path" "target_URL"

Nous redirigeons une URL sur le serveur vers une autre URL interne dans un premier temps. La barre oblique au début désigne le début du chemin d’URL, à savoir la partie après le domaine :

Redirect 301 "/old.html" "/new.html"

Si nous souhaitons effectuer le renvoi vers une URL externe, nous la notons au titre de destination :

Redirect 301 "/old.html" "http://example.com/new.html"

Vous pouvez également définir des redirections 301 de répertoires entiers dans le fichier .htaccess à l’aide de la directive Redirect. Nous redirigeons toutes les URL commençant par le composant de chemin « fr » vers un sous-domaine :

Redirect 301 "/fr/" "http://fr.example.com/"

En adoptant le même schéma, toutes les URL d’un domaine peuvent être redirigées vers un autre domaine :

Redirect 301 "/" "http://other.example.com/"

Si vous voulez rediriger de nombreuses adresses individuelles calquées sur un certain schéma, la notation des redirections au cas par cas va prendre rapidement des proportions fastidieuses. Vous pouvez recourir dans ce cas à la directive RedirectMatch. Elle utilise une expression régulière pour détecter des motifs et en extraire des éléments :

RedirectMatch 301 regex URL

Voici un exemple d’entrée RedirectMatch qui extrait la catégorie et le numéro d’identification d’un article issu des paramètres GET, et les réécrit dans le chemin :

RedirectMatch 301 "/article.php?cat=(.*)&id=(.*)" "/articles/$1/$2/"

Prenons comme exemple le domaine example.com. L’URL http://example.com/article.php?cat=web&id=42 serait alors redirigée vers http://example.com/articles//web/42/.

### Redirects complexes pour la redirection 301 dans le fichier .htaccess

Pour créer des redirections 301 pour des cas d’utilisation complexes, on se tourne vers des directives de réécriture du module de redirection Apache mod_rewrite. Cela vous permet de définir et d’interroger des conditions de redirection, de définir et de lire des variables d’environnement et de définir des règles de redirection avec des expressions régulières.

Avec mod_rewrite, il est possible d’enchaîner des règles de redirection ; le module fournit quasiment un mini-langage de programmation pour reformer les URL et déclencher des redirections. Faites preuve de prudence ici, car une erreur pourrait se traduire par des boucles sans fin.

Les directives Rewrite commencent par la ligne « RewriteEngine on ». Cette opération est suivie de conditions de redirection RewriteCond facultatives, complétées par une ou plusieurs règles de redirection RewriteRule. Le comportement des conditions et des règles de redirection peut être influencé par des options nommées « flags » ou « drapeaux ». Pour déclencher une redirection 301, l’une des règles doit contenir les drapeaux L,R=301 :

RewriteEngine on
RewriteCond TestString CondPattern [flags]
RewriteRule URL_path Substitution [L,R=301]

L’accès à de nombreuses variables d’en-tête et de serveur de la forme %{HTTP_HOST}, %{REQUEST_URI}, etc. est garanti au sein des règles et conditions de redirection. Elles peuvent être reliées par des opérateurs et traitées à l’aide de fonctions. Il est ainsi permis de réaliser pratiquement n’importe quelle redirection souhaitée, même si la syntaxe n’est pas d’un abord intuitif.

Examinons un exemple de 301 Redirect réalisé à l’aide de mod_rewrite. Nous souhaitons forcer des URL canoniques pour éviter le contenu dupliqué. Cela signifie que toutes les URL doivent commencer par HTTPS et WWW, quelle que soit la manière dont les visiteurs accèdent au contenu.

Nous définissons deux conditions de redirection, que nous relions les unes aux autres par le drapeau OR. La première condition teste si HTTPS est désactivé, la deuxième condition vérifie si le WWW de tête ne précède pas le domaine. Nous utilisons le drapeau NC pour désactiver la distinction entre majuscules et minuscules. Si l’une des deux conditions est vérifiée, nous redirigeons l’URL vers sa version HTTPS-WWW par 301 Redirect. Nous utilisons l’expression régulière (.*), qui récupère n’importe quelle URL, et l’accole derrière le domaine en utilisant $1 :

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]

Quels sont les problèmes et les dangers liés à l’utilisation de 301 Redirects ?

Les redirections de type 301 Redirect sont des outils standard dans le domaine du développement Web et du référencement. Cependant, il convient de procéder à la configuration avec prudence, car d’importants problèmes peuvent se produire si les redirections sont utilisées de manière incorrecte. Le serveur peut par exemple planter ou le site peut dégringoler dans le classement des moteurs de recherche.

### Corruption du fichier .htaccess lors d’une modification manuelle

Le fichier .htaccess configure le serveur Web Apache au niveau du répertoire. Même les modifications incorrectes les plus infimes apportées au fichier .htaccess peuvent irrémédiablement conduire à un site Web inaccessible. La fameuse erreur serveur 500 ou page blanche WordPress risquent alors de se produire.

Il est préférable de créer une copie du fichier .htaccess avant de le modifier. Ceci est très facile en partant de la ligne de commande. Nous basculons dans le répertoire Web public du site et utilisons la commande cp :

cp -a .htaccess _htaccess

Si des erreurs se produisent à la suite de la modification du fichier .htaccess, nous restaurons la version originale:

cp -a _htaccess .htaccess
### Chaînes et boucles de redirection

Les redirections sont utiles, mais se traduisent par un cycle requête-réponse complet et « coûteux ». Les utilisateurs doivent patienter lorsque les redirections sont enchaînées, ce qui se traduit par un taux de rebond accru. De plus, les moteurs de recherche évaluent les pages qui se redirigent plusieurs fois de suite de manière négative. Un maximum de trois redirections successives est généralement admis.

Les boucles de redirection, dans lesquelles deux adresses se redirigent mutuellement sans fin, sont fatales. Ceci se traduit par une erreur de navigateur ERR_TOO_MANY_REDIRECTS pour l’utilisateur. La ressource souhaitée est donc inaccessible. D’une manière générale, il est recommandé de tester les redirections nouvellement configurées avec cURL pour s’assurer que le résultat souhaité est atteint.

### Empoisonnement accidentel du cache lors de l’utilisation de la redirection 301

Une mauvaise utilisation de 301 Redirect peut devenir un vrai casse-tête par la suite. Contrairement aux redirections temporaires des types 302, 303 et 307, la redirection 301 indique au client de mettre la nouvelle URL en cache. Si l’on souhaite revenir ultérieurement à l’URL d’origine, les clients y resteront insensibles et continueront inlassablement à se connecter à la nouvelle URL. L’utilisation de redirections temporaires ou la définition de l’en-tête Cache-Control par une valeur appropriée permet de contrecarrer cet effet.

Nous avons réglé l’en-tête Cache-Control sur une heure lors de la définition de la règle Redirect 301 dans .htaccess. Cela permet de s’assurer que les modifications ultérieures apportées à la destination de redirection parviennent à tous les clients :

ExpiresActive on
ExpiresDefault "access plus 1 hour"
Redirect 301 / https://www.example.com/

En cas d’utilisation de redirections complexes avec des directives de réécriture, nous avons recours à une astuce pour définir l’en-tête Cache-Control. Nous définissons une variable d’environnement limitcache dans le cadre de la règle de redirection 301. Nous définissons ensuite l’en-tête, en lisant la variable d’environnement comme condition. Ceci permet de s’assurer que l’en-tête correct est défini lors de la redirection :

RewriteRule ^.* http://www.example.com/ [L,R=301,E=limitcache:1]
Header always set Cache-Control "max-age=3600" env=limitcache
Conseil

Vous avez suivi une redirection 301 et le navigateur refuse maintenant d’accéder à l’adresse d’origine ? Il suffit d’accoler une chaîne de requête avec un contenu quelconque sous la forme ?foo=bar à l’ancienne adresse et de forcer ainsi le navigateur à charger l’URL.