Aller au contenu
OneKitly

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

Daniel OkonkwoDéveloppeur front-end et rédacteur Tech chez OneKitly

Performance web · Formats de fichiers

Vérifié à partir de 2 sources

Voir le profil
En bref

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.

Les codes qu'il faut choisir juste, et ce à quoi chacun t'engage
CodeNomCe à quoi il t'engageOù ça dérape
200OKLa requête a réussi et le corps est le résultatRenvoyé avec un message d'erreur dans le corps, ce qui masque l'échec aux caches, à la supervision et aux robots
301Déplacé définitivementCette URL est remplacée pour de bon ; mets tes liens à jourUtilisé alors que rien n'est décidé — les navigateurs le mettent durablement en cache, et les clients anciens transforment un POST redirigé en GET
302TrouvéVa là pour l'instant ; continue d'utiliser l'URL d'origineUtilisé pour un déplacement définitif, si bien que l'ancienne URL continue d'absorber les signaux de classement
304Non modifiéTa copie en cache est toujours valable ; il n'y a pas de corpsEnvoyé hors d'une requête conditionnelle, ou accompagné d'un corps que les clients ont le droit d'ignorer
307Redirection temporaireComme 302, mais la méthode et le corps ne doivent pas être modifiésRarement choisi, de sorte que les redirections temporaires cassent en silence les flux fondés sur POST
308Redirection permanenteComme 301, mais la méthode et le corps ne doivent pas être modifiésOublié pour les points d'entrée d'API, où un 301 rétrograde discrètement un POST en GET
401Non authentifiéAucune information d'authentification valide n'a été présentée ; un en-tête WWW-Authenticate indique ce qui est attenduRenvoyé à un utilisateur déjà connecté mais sans le droit — ce cas relève du 403
403InterditL'identité est acceptée et l'action est refusée malgré toutUtilisé comme fourre-tout, ce qui pousse les clients à retenter une authentification qui n'y changera rien
404Non trouvéIl n'y a rien à cette URL, et le serveur ne dit pas si c'est définitifRemplacé par une page avenante servie en 200, le soft 404 qui maintient indexées des URL mortes
410DisparuRetiré délibérément et ne reviendra pas ; cacheable par défautPresque jamais employé, même quand la suppression était voulue et que 404 en dit trop peu
429Trop de requêtesUne limite de débit est atteinte ; Retry-After indique combien de temps attendre avant une nouvelle requêteEnvoyé sans Retry-After, laissant les clients deviner et marteler le point d'entrée
500Erreur interne du serveurLe serveur a échoué et n'a rien de plus précis à direRenvoyé pour une requête client incorrecte, qui relève plutôt de la plage 400
502Mauvaise passerelleUn proxy a reçu une réponse invalide du serveur auquel il a transmisDébogué dans l'application, alors que la faute se situe entre le proxy et l'amont
503Service indisponibleTemporairement 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
Référence des codes de statut HTTPRecherche et parcours tous les codes de statut HTTP standard par classe, avec leur nom et une description en une ligne.Essayer l'outil

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
TutorielComment écrire une expression cron : cinq champs et la règle du OU dont personne ne parleMinute, heure, jour du mois, mois, jour de la semaine. Les pièges : un pas est une progression dans une plage et non un intervalle, et les deux champs de jour sont combinés par OU — si bien que 0 0 1 * 1 se déclenche le 1er et tous les lundis.TutorielComment écrire un robots.txt : directives, correspondance, et ce qu'il ne peut pas cacherQuatre directives, deux jokers, un fichier à la racine de l'hôte. C'est une instruction d'exploration et rien de plus — il ne retire pas une page des résultats, ne restreint pas l'accès, et publie chaque chemin que tu y inscrives.ExplicationComment fonctionnent les permissions Unix : lire 755 sans devinerLecture 4, écriture 2, exécution 1, et chacun des trois chiffres décrit une partie différente. Ce que la plupart des explications ratent : ce que fait le bit d'exécution sur un répertoire — il accorde la traversée, pas le droit de lancer quoi que ce soit.ComparatifcamelCase, snake_case, kebab-case : laquelle, et pourquoi tu choisis rarementLes conventions ne relèvent pas du goût. Le trait d'union est l'opérateur moins : kebab-case ne peut donc pas être un identifiant dans la plupart des langages - et c'est précisément pourquoi CSS et les URL l'utilisent. Avec en prime l'aller-retour sur les acronymes qui corrompt les noms en silence, et la règle qui le corrige.ExplicationPoint-virgule, tabulation, barre verticale : choisir un délimiteur qui survit au trajetPourquoi la langue du lecteur décide du délimiteur, ce que le convertisseur fait aux guillemets quand tu changes, ce qu'est réellement la première ligne sep=, et le nombre de cellules citées sur le même export écrit de cinq façons.TutorielLes bases des regex : guide du débutantUne expression régulière est un motif pour rechercher du texte. Voici les briques de base — classes de caractères, quantificateurs et ancres — avec un exemple.

Outils similaires

Sources

Tu as repéré une erreur dans cet article ?

Les codes de statut HTTP expliqués : ceux qu'on confond vraiment — OneKitly