Les codes de statut HTTP expliqués : ceux qu'on confond vraiment
Publié le 29/04/2026 · 9 min de lecture · Outils pour développeurs
Daniel Okonkwo — Développeur front-end et rédacteur Tech chez OneKitly
Performance web · Formats de fichiers
Vérifié à partir de 2 sources
Le premier chiffre est la partie que lisent tous les clients, caches et robots : 1xx informationnel, 2xx succès, 3xx redirection, 4xx la requête était fautive, 5xx le serveur l'était. À l'intérieur, les distinctions qui changent le comportement sont les suivantes. 308 est un 301 assorti de la garantie que la méthode et le corps survivent à la redirection, et 307 est un 302 avec la même garantie — les clients anciens transforment un POST redirigé en GET sur 301 et 302, ce qui est précisément la raison d'être de 307 et 308. 401 signifie que la requête ne portait aucune information d'authentification valide et doit s'accompagner d'un en-tête WWW-Authenticate ; 403 signifie que les identifiants étaient bons et que l'action est refusée malgré tout, donc se reconnecter n'y changera rien. 404 dit qu'il n'y a rien ici sans se prononcer sur la raison ; 410 dit que la ressource a été retirée délibérément et ne reviendra pas, et il est cacheable par défaut. Sur 429 et 503, Retry-After est une estimation publiée par le serveur, en secondes ou sous forme de date HTTP — une indication pour les clients bien élevés, pas la promesse d'un retour à l'heure.
301 contre 308, 302 contre 307, 401 contre 403, 404 contre 410 — plus ce que promet réellement Retry-After sur un 429 ou un 503. Les paires où choisir le mauvais code change le comportement, pas seulement la formulation.
Le premier chiffre est la seule partie que certains clients lisent
La RFC 9110 exige d'un client qu'il comprenne la classe d'un code de statut même s'il ne reconnaît pas le code lui-même, et qu'il traite tout code inconnu comme le x00 de sa classe. Un client qui n'a jamais entendu parler du 451 le gère comme un 400 ; un 599 inconnu est géré comme un 500. C'est cette règle qui rend l'espace extensible, et elle signifie aussi que la classe porte presque tout le comportement : les caches en déduisent la conservation, les proxys les retentatives, les robots l'indexation — le plus souvent avant même d'analyser ton corps de réponse.
Conséquence pratique : renvoyer un 200 avec l'erreur décrite dans le corps place l'échec là où rien d'autre ne peut le voir. Ta sonde de disponibilité passe au vert, ton CDN met la page d'erreur en cache et un moteur de recherche l'indexe comme un vrai document. C'est le problème du soft 404 sous sa forme générale, et il mérite un audit, car la correction tient en une ligne — le code de statut — et non en une refonte.
Redirections : lesquelles conservent ton POST
La grille des quatre codes de redirection croise en réalité deux questions : permanent ou temporaire, et la méthode survit-elle. 301 et 308 sont permanents, 302 et 307 temporaires ; 307 et 308 sont les deux qui interdisent au client de modifier la requête. MDN est direct sur la raison d'être de la paire récente : le 301 exigeait déjà que la méthode et le corps restent inchangés, mais cette exigence était mal appliquée par les clients anciens, qui basculaient en GET. Impossible de corriger le parc installé : on a donc frappé deux nouveaux codes avec la garantie inscrite dans leur définition.
Le choix découle donc du trafic. Pour une page qui ne reçoit que des GET, le 301 convient et c'est ce à quoi les moteurs sont le plus habitués. Pour un chemin d'API, une cible de formulaire ou tout ce qui peut recevoir POST, PUT ou DELETE, utilise 308 et la requête arrive intacte. Une mise en garde sur la permanence : les navigateurs mettent un 301 en cache de façon agressive, parfois bien plus longtemps que prévu, si bien qu'un 301 émis pendant un test peut survivre au test sur des machines auxquelles tu n'as pas accès. Sers du 302 ou du 307 tant que rien n'est tranché.
Les erreurs le plus souvent mal renvoyées
401 et 403 forment la paire qui coûte le plus de temps au support. Le 401 signifie que la requête ne portait pas d'informations d'authentification valides, et MDN précise qu'il s'accompagne d'un en-tête WWW-Authenticate décrivant le schéma attendu par le serveur — c'est une invitation à réessayer avec des identifiants. Le 403 est la situation inverse : les identifiants sont parfaitement valides et le client n'a malgré tout pas la permission pour cette action. Renvoyer un 401 à un utilisateur connecté demande à son client de se réauthentifier, ce qui produira exactement le même refus, et lui laisse croire que sa connexion est cassée alors qu'elle ne l'est pas.
404 et 410 ne diffèrent que par le degré de certitude, et c'est tout l'enjeu. La recommandation de MDN est explicite : si l'exploitant du serveur ignore si la situation est temporaire ou définitive, il faut un 404. Le 410 s'emploie quand tu as retiré la chose exprès et qu'elle ne reviendra pas — il est cacheable par défaut et dit aux robots de cesser de demander. Le Retry-After, lui, est un en-tête qui porte soit un délai en secondes, soit une date HTTP ; sur un 503 il estime la durée d'indisponibilité du service, sur un 429 il indique combien de temps attendre avant une nouvelle requête. C'est une indication, pas un contrat, et MDN note que la prise en charge par les clients est inégale — mais Googlebot le respecte, ce qui suffit à justifier de le poser lors d'une maintenance planifiée.
| Code | Nom | Ce à quoi il t'engage | Où ça dérape |
|---|---|---|---|
| 200 | OK | La requête a réussi et le corps est le résultat | Renvoyé avec un message d'erreur dans le corps, ce qui masque l'échec aux caches, à la supervision et aux robots |
| 301 | Déplacé définitivement | Cette URL est remplacée pour de bon ; mets tes liens à jour | Utilisé alors que rien n'est décidé — les navigateurs le mettent durablement en cache, et les clients anciens transforment un POST redirigé en GET |
| 302 | Trouvé | Va là pour l'instant ; continue d'utiliser l'URL d'origine | Utilisé pour un déplacement définitif, si bien que l'ancienne URL continue d'absorber les signaux de classement |
| 304 | Non modifié | Ta copie en cache est toujours valable ; il n'y a pas de corps | Envoyé hors d'une requête conditionnelle, ou accompagné d'un corps que les clients ont le droit d'ignorer |
| 307 | Redirection temporaire | Comme 302, mais la méthode et le corps ne doivent pas être modifiés | Rarement choisi, de sorte que les redirections temporaires cassent en silence les flux fondés sur POST |
| 308 | Redirection permanente | Comme 301, mais la méthode et le corps ne doivent pas être modifiés | Oublié pour les points d'entrée d'API, où un 301 rétrograde discrètement un POST en GET |
| 401 | Non authentifié | Aucune information d'authentification valide n'a été présentée ; un en-tête WWW-Authenticate indique ce qui est attendu | Renvoyé à un utilisateur déjà connecté mais sans le droit — ce cas relève du 403 |
| 403 | Interdit | L'identité est acceptée et l'action est refusée malgré tout | Utilisé comme fourre-tout, ce qui pousse les clients à retenter une authentification qui n'y changera rien |
| 404 | Non trouvé | Il n'y a rien à cette URL, et le serveur ne dit pas si c'est définitif | Remplacé par une page avenante servie en 200, le soft 404 qui maintient indexées des URL mortes |
| 410 | Disparu | Retiré délibérément et ne reviendra pas ; cacheable par défaut | Presque jamais employé, même quand la suppression était voulue et que 404 en dit trop peu |
| 429 | Trop de requêtes | Une limite de débit est atteinte ; Retry-After indique combien de temps attendre avant une nouvelle requête | Envoyé sans Retry-After, laissant les clients deviner et marteler le point d'entrée |
| 500 | Erreur interne du serveur | Le serveur a échoué et n'a rien de plus précis à dire | Renvoyé pour une requête client incorrecte, qui relève plutôt de la plage 400 |
| 502 | Mauvaise passerelle | Un proxy a reçu une réponse invalide du serveur auquel il a transmis | Débogué dans l'application, alors que la faute se situe entre le proxy et l'amont |
| 503 | Service indisponible | Temporairement incapable de répondre ; Retry-After estime la durée de l'indisponibilité | Remplacé par un 500 pendant une maintenance planifiée, si bien que les robots prennent la coupure pour une vraie panne |
Questions fréquentes
- Une migration de site doit-elle utiliser 301 ou 308 ?
- Pour les pages qui ne sont récupérées qu'en GET, le 301 est le choix sûr, celui que tous les robots et proxys traitent depuis des décennies. Prends le 308 pour tout ce qui peut recevoir un POST, un PUT ou un DELETE — points de formulaire, routes d'API, récepteurs de webhooks — car c'est là qu'un client rétrogradant la méthode en silence transforme une redirection en corps de requête perdu. Rien n'empêche d'utiliser les deux sur la même migration, route par route.
- Que doit renvoyer une API quand la validation échoue ?
- Emploie 400 Bad Request quand la requête elle-même est malformée et que le serveur ne peut pas l'analyser — JSON cassé, en-tête obligatoire manquant. Emploie 422 Unprocessable Content quand la syntaxe est correcte mais que le contenu enfreint tes règles, par exemple un corps bien formé dont la date de fin précède la date de début. Ce qu'il ne faut pas renvoyer, c'est un 500, qui impute au serveur une erreur du client et pollue ton budget d'erreurs, ni un 200 avec le problème décrit dans le corps, qui masque l'échec à toutes les couches situées entre toi et l'appelant.
- Les 404 nuisent-elles au référencement ?
- Un 404 est une réponse valide et honnête, et une part normale de tout site qui existe depuis un certain temps ; une page qui n'existe plus doit le dire. Le mal vient des substituts. Un soft 404 — une page avenante servie en statut 200 — maintient des URL mortes dans l'index et dépense du budget d'exploration pour rien. Rediriger en bloc toutes les pages manquantes vers l'accueil est la même erreur déguisée en 301. Si la suppression était délibérée et définitive, le 410 le dit clairement.
Articles qui pourraient t'intéresser
Tous les guides →Outils similaires
Sources
Tu as repéré une erreur dans cet article ?