Codes de statut HTTP, gratuit

Référence complète des codes de statut de réponse HTTP avec explications et cas d'usage.

Catégories de codes de statut HTTP

Quelle est la différence entre 301 et 302 ?

301 Moved Permanently indique aux clients que la ressource a définitivement été déplacée · les moteurs de recherche transfèrent le classement. 302 Found est une redirection temporaire · l'URL d'origine conserve son classement.

Quand utiliser 401 plutôt que 403 ?

401 Unauthorized signifie « non authentifié » · le client doit fournir des identifiants. 403 Forbidden signifie « authentifié mais non autorisé » · les identifiants n'y changeront rien.

Que signifie le code de statut 418 ?

418 « I'm a teapot » est une blague de poisson d'avril issue de la RFC 2324 (Hyper Text Coffee Pot Control Protocol). Il n'est pas utilisé en pratique mais est très connu dans la culture des développeurs.

Une norme et trois décennies de dérive

Les codes de statut HTTP ont traversé plusieurs générations de spécifications. La RFC 1945 (mai 1996) a normalisé HTTP/1.0 avec les catégories de base 1xx-5xx. La RFC 2616 (juin 1999) a livré HTTP/1.1 et a été la référence canonique pendant plus d'une décennie. La série 7230-7235 (juin 2014) a scindé HTTP/1.1 en plusieurs spécifications par thème. La norme consolidée actuelle est la RFC 9110 « HTTP Semantics » (juin 2022), qui rend obsolète la scission 7230-7235 et constitue la bonne référence pour les travaux modernes. Le registre complet et à jour des codes attribués se trouve au registre des codes de statut HTTP de l'IANA.

Les cinq catégories en un coup d'œil

Les comparaisons « vs » qui font trébucher tout le monde

401 contre 403. La paire la plus confondue. 401 Unauthorized signifie « vous ne vous êtes pas authentifié, essayez de vous connecter » (le nom est techniquement trompeur : il s'agit d'authentification, pas d'autorisation). 403 Forbidden signifie « vous êtes authentifié, mais vous n'avez pas le droit de faire cette chose » : vos identifiants sont valides mais ne donnent pas accès à cette ressource. Un mauvais usage courant : renvoyer 403 pour des requêtes non authentifiées alors que 401 avec un en-tête WWW-Authenticate est correct.

301 contre 302 contre 307 contre 308. Deux axes : permanent contre temporaire, et le comportement de préservation de méthode :

CodePermanent ?Méthode préservée ?Signal de classement SEO
301 Moved PermanentlyOuiHistoriquement, les clients changeaient POST → GETPermanent, transfère le classement à la nouvelle URL
302 FoundNonHistoriquement, les clients changeaient POST → GETTemporaire, l'URL d'origine conserve le classement
307 Temporary RedirectNonStrict, POST reste POSTComme 302
308 Permanent RedirectOuiStrict, POST reste POSTComme 301

Si vous redirigez des requêtes GET à des fins de SEO, 301 est le choix conventionnel. Si vous redirigez des requêtes POST ou PUT et voulez préserver la méthode, il vous faut 307 ou 308.

400 contre 422. 400 Bad Request concerne les requêtes syntaxiquement mal formées : JSON invalide, en-têtes requis manquants, paramètres de requête mal formés. 422 Unprocessable Entity (à l'origine un code WebDAV, largement adopté par les API REST) concerne les requêtes syntaxiquement valides présentant des problèmes sémantiques : le JSON s'analyse correctement, mais les valeurs échouent à la validation métier (quantité négative sur une commande, e-mail déjà utilisé). De nombreuses API utilisent les deux.

502 contre 503 contre 504. Trois modes de défaillance amont différents :

404 contre 410. 404 Not Found signifie « nous ne savons pas si cela existe ou non ». 410 Gone signifie « cela existait, c'est définitivement supprimé ». Impact SEO : Google traite 410 comme un signal plus fort indiquant que le contenu est définitivement indisponible et le retire de l'index plus vite qu'il ne le fait pour 404.

Conventions des API REST

Les API REST modernes ont convergé vers un ensemble assez cohérent de conventions sur la signification des codes de statut selon les actions :

MéthodeCas nominalErreurs courantes
GET200 OK avec corps, ou 304 Not Modified si en cache404 si la ressource est absente, 403 si interdit
POST (créer)201 Created avec en-tête Location pointant vers la nouvelle ressource400 pour un corps mal formé, 422 pour les erreurs de validation, 409 pour les conflits
PUT (remplacer) / PATCH (mettre à jour)200 OK avec corps mis à jour, ou 204 No Content404 si la ressource est absente, 409 pour les conflits de version
DELETE204 No Content (ou 200 avec confirmation de suppression)404 si absente
Toute méthode (limitée en débit)-429 Too Many Requests avec en-tête Retry-After
Toute méthode (authentification)-401 si pas d'authentification, 403 si authentifié mais sans permission

Implications pour le SEO

Codes célèbres et culturels

Erreurs courantes

  1. Utiliser 200 OK pour des erreurs avec un corps d'erreur. Renvoyer {"error": "not found"} avec un statut 200 perturbe toutes les couches de cache, tous les outils de surveillance et tous les SDK client. Utilisez le bon code de statut.
  2. Renvoyer 403 pour des requêtes non authentifiées. Le bon code est 401 avec un en-tête WWW-Authenticate.
  3. Utiliser 302 quand vous voulez dire 301. Si le déplacement est permanent, les moteurs de recherche ont besoin du 301 pour transférer le classement. 302 garde l'ancienne URL indexée.
  4. Utiliser 301 ou 302 pour les redirections POST/PUT. Historiquement, ceux-ci permettaient aux clients de changer la méthode en GET. 307 et 308 préservent strictement la méthode d'origine.
  5. Renvoyer 500 alors que 503 est visé. Si le serveur est surchargé ou en maintenance, 503 avec Retry-After est le bon signal, à la fois pour les clients et pour Googlebot.
  6. Utiliser 404 pour des pages définitivement supprimées. 410 Gone est le signal plus fort et est retiré des index des moteurs de recherche plus vite.
  7. Oublier l'en-tête Location sur les réponses 201 et 3xx. L'en-tête Location est ce qui indique au client où se trouve la nouvelle ressource ou vers où rediriger. Sans lui, les clients ne peuvent pas naviguer.

Autres questions fréquentes

Quand devrais-je renvoyer 422 plutôt que 400 ?

400 Bad Request signifie que la requête elle-même est mal formée : JSON invalide, en-têtes requis manquants, paramètres de requête mal formés. 422 Unprocessable Entity signifie que la requête est bien formée mais contient des erreurs sémantiques qui empêchent le traitement : un champ de quantité défini sur un nombre négatif, une adresse e-mail déjà utilisée, une date dans le passé pour un champ réservé au futur. Les conventions des API REST modernes ont convergé vers cette distinction, la plupart des grandes API (GitHub, Stripe, Twilio) utilisant 422 pour les erreurs de validation.

Pourquoi Cloudflare renvoie-t-il parfois 520, 521, 522… ?

Les codes 520-527 sont spécifiques à Cloudflare, signalant différentes façons dont leur périphérie n'a pas pu joindre votre serveur d'origine. 520 est le générique « le serveur web a renvoyé une erreur inconnue » ; 521 signifie que votre origine a refusé la connexion ; 522 est un délai de connexion dépassé vers votre origine ; 524 signifie que votre origine a mis trop de temps à répondre. Ils ne figurent pas dans le registre de l'IANA, mais sont fréquemment rencontrés quand des sites derrière Cloudflare ont des problèmes de backend.

Mon navigateur me montrera-t-il quel code mon API a renvoyé ?

Oui, ouvrez les DevTools → l'onglet Réseau, cliquez sur la requête et regardez la colonne « Status ». Les navigateurs affichent aussi des pages génériques pour certains codes (le jeu du dinosaure lors des échecs de connexion de Chrome, les pages 404 / 500 standard) ; mais le code numérique réel est toujours dans la réponse.

Qu'est-ce que 103 Early Hints ?

Un code 1xx relativement nouveau (RFC 8297, 2017) qui permet au serveur d'envoyer des en-têtes Link: rel=preload avant que la réponse complète ne soit prête, indiquant au navigateur de commencer à récupérer tôt les ressources critiques (CSS, polices, images). Désormais pris en charge par Chrome et livré par Cloudflare, Fastly et d'autres CDN comme optimisation de performance.

Puis-je inventer mon propre code de statut ?

Techniquement oui : HTTP autorise n'importe quel code à 3 chiffres dans la plage 100-599. En pratique non : les clients, les proxys et les caches traitent les codes inconnus selon leur premier chiffre (donc 4xx = erreur client de façon générique, 5xx = erreur serveur). Certains fournisseurs le font (les 520 de Cloudflare, le 444 de Nginx), mais à moins de contrôler les deux extrémités du fil, tenez-vous-en au registre de l'IANA. Inventer un 299 ne cassera rien, mais ne communiquera rien non plus.

Pourquoi le « code de statut » s'appelle-t-il un « statut » et non un « code d'erreur » ?

Parce que la plupart ne sont pas des erreurs. 200 OK est le code de statut le plus renvoyé au monde : il signifie « tout s'est bien passé ». Les codes communiquent le statut de la requête : succès, redirection, erreur client, erreur serveur. Les appeler « codes d'erreur » biaise vers les cas négatifs qui sont journalisés et remarqués ; les codes de succès font leur travail silencieusement à chaque microseconde.

Outils associés

Analyseur & décodeur d'URL, gratuit Générateur .htaccess, gratuit Encodage et décodage d'URL en ligne, gratuits