Messages de statut HTTP
Référence complète des codes de statut HTTP (1xx–5xx) avec les plus courants expliqués et un exemple fetch() qui branche sur response.status.
Chaque fois qu'un navigateur charge une page, soumet un formulaire ou que votre JavaScript effectue un appel fetch(), le serveur répond avec un code de statut HTTP à trois chiffres. Ce code indique au client si la requête a réussi, a été redirigée, a échoué en raison d'une erreur côté client ou d'une erreur côté serveur. Le navigateur l'utilise automatiquement — il suit les redirections, affiche sa propre page d'erreur pour certains codes et réutilise le contenu en cache pour d'autres — mais en tant que développeur, vous lisez aussi ces codes directement : un formulaire est envoyé et vous branchez sur la réponse, ou un fetch() se résout et vous vérifiez response.ok (qui signifie simplement « statut dans la plage 200–299 »).
Vous trouverez ici la liste des codes de statut de réponse du Hypertext Transfer Protocol (HTTP). Ces codes répondent à la requête qu'un client adresse à un serveur — que cette requête utilise GET, POST ou une autre méthode HTTP — et ils sont regroupés en 5 classes selon leur premier chiffre. Les connaître vous aide à déboguer les liens brisés, les URL incorrectes, les soumissions de formulaires échouées et les réponses API inattendues. Parcourons chaque classe :
Si vous recevez une réponse qui ne figure pas dans cette liste, cela signifie qu'il s'agit d'une réponse non standard, peut-être propre au logiciel du serveur.
Gestion des codes de statut en JavaScript
Lorsque vous soumettez un formulaire ou appelez une API avec fetch(), la requête réussit (la promesse se résout) même si le serveur retourne une erreur 4xx ou 5xx — un 404 ou 500 reste une réponse HTTP valide, et non une défaillance réseau. Vous devez donc inspecter le statut vous-même. Le raccourci pratique est response.ok, qui vaut true uniquement pour la plage 200–299 ; pour tout autre cas, vous branchez sur response.status pour réagir de manière appropriée :
const form = document.querySelector("#signup");
form.addEventListener("submit", async (event) => {
event.preventDefault();
const response = await fetch("/api/signup", {
method: "POST",
body: new FormData(form),
});
if (response.ok) {
// 200–299: success
window.location.href = "/welcome";
} else if (response.status === 401) {
showMessage("Please log in first.");
} else if (response.status === 422) {
// Validation errors returned as JSON
const data = await response.json();
showMessage(data.error);
} else if (response.status === 429) {
// Rate limited — respect the Retry-After header
const wait = response.headers.get("Retry-After");
showMessage(`Too many attempts. Try again in ${wait}s.`);
} else if (response.status >= 500) {
showMessage("Server error — please try again later.");
} else {
showMessage(`Unexpected error (${response.status}).`);
}
});Notez que fetch() ne rejette qu'en cas de véritables problèmes réseau (pas de connexion, blocage CORS, échec DNS), donc encapsuler l'appel dans un try…catch gère ces cas, tandis que le if/else ci-dessus gère le statut HTTP lui-même.
Les codes les plus importants à connaître en premier. Si vous n'en mémorisez qu'une poignée, choisissez ceux-ci : 200 (OK), 301 (Moved Permanently), 302 (Found / redirection temporaire), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found) et 500 (Internal Server Error). Ils couvrent la grande majorité de ce que vous verrez dans les outils de développement du navigateur et les journaux serveur.
1xx : Information
| Code de statut | Message | Description |
|---|---|---|
| 100 | Continue | Signifie que le serveur a reçu les en-têtes de la requête et que le client doit continuer à envoyer le corps de la requête. |
| 101 | Switching Protocols | Signifie que le client, qui a fait une requête, a demandé au serveur de changer de protocole (par exemple, pour passer à une connexion WebSocket). |
| 102 | Processing | Un code WebDAV signifiant que le serveur a accepté la requête mais ne l'a pas encore terminée ; utilisé pour éviter que le client n'expire lors d'une opération longue. |
| 103 | Early Hints | Défini dans RFC 8297. Permet au serveur d'envoyer certains en-têtes de réponse (comme les en-têtes Link qui préchargent des ressources) avant la réponse finale, afin que le navigateur puisse commencer à récupérer des ressources plus tôt. |
2xx : Succès
| Code de statut | Message | Description |
|---|---|---|
| 200 | OK | Signifie que la requête est OK. Il s'agit de la réponse standard pour les requêtes HTTP réussies. |
| 201 | Created | Signifie que la requête a été satisfaite et qu'une nouvelle ressource a été créée. |
| 202 | Accepted | Signifie que la requête a été acceptée pour traitement, mais que le traitement est en cours. |
| 203 | Non-Authoritative Information | Signifie que la requête a été traitée avec succès, mais qu'elle retourne des informations pouvant provenir d'une autre source. |
| 204 | No Content | Signifie que la requête a été traitée avec succès, mais qu'elle ne retourne aucun contenu. |
| 205 | Reset Content | Signifie que la requête a été traitée, mais qu'elle ne retourne aucun contenu et exige que le demandeur réinitialise la vue du document. |
| 206 | Partial Content | Signifie que le serveur ne livre qu'une partie de la ressource, en raison d'un en-tête de plage envoyé par le client. |
3xx : Redirection
| Code de statut | Message | Description |
|---|---|---|
| 300 | Multiple Choices | Indique plusieurs options pour la ressource que le client peut suivre. |
| 301 | Moved Permanently | Signifie que la page a été définitivement déplacée vers une nouvelle URL. Les navigateurs et les moteurs de recherche mettent à jour leurs références, donc un 301 transmet l'équité de lien vers la nouvelle URL et constitue le bon choix pour les redirections favorables au SEO. |
| 302 | Found | Signifie que la page demandée a été temporairement déplacée vers une nouvelle URL. Les moteurs de recherche conservent l'URL d'origine indexée, donc utilisez 302 (et non 301) quand le déplacement est de courte durée, par exemple lors d'une maintenance ou de tests A/B. |
| 303 | See Other | Signifie que la réponse à la requête peut être trouvée à une autre URL, que le client doit récupérer avec GET. Couramment utilisé après un POST de formulaire pour rediriger vers une page de résultat. |
| 304 | Not Modified | Signifie que la ressource demandée n'a pas été modifiée depuis sa dernière mise en cache. Le serveur n'envoie pas de corps, donc le navigateur réutilise sa copie en cache — cela économise de la bande passante et accélère les visites répétées. |
| 307 | Temporary Redirect | Signifie que la page demandée a été temporairement déplacée vers une nouvelle URL. Contrairement au 302, le client doit conserver la méthode de requête d'origine (un POST reste un POST). |
| 308 | Permanent Redirect | Signifie que la ressource demandée a été définitivement déplacée vers une nouvelle URL. |
Les codes non listés ici (comme 305 et 306) sont dépréciés, rares ou spécifiques à des extensions.
4xx : Erreur client
| Code de statut | Message | Description |
|---|---|---|
| 400 | Bad Request | Signifie que la requête ne peut pas être satisfaite en raison d'une mauvaise syntaxe ou de données invalides. |
| 401 | Unauthorized | Signifie que le client n'est pas authentifié — des identifiants valides sont manquants ou incorrects. Le serveur ne sait pas encore qui vous êtes, donc il vous demande de vous connecter. (Remarque : le nom dit « Unauthorized » mais signifie réellement « Non authentifié ».) |
| 402 | Payment Required | Est réservé à un usage futur. |
| 403 | Forbidden | Signifie que le client est authentifié mais non autorisé — le serveur sait qui vous êtes, mais vous n'avez pas la permission d'accéder à cette ressource. Contrairement au 401, envoyer à nouveau des identifiants n'aidera pas. |
| 404 | Not Found | Signifie que la page demandée est introuvable pour le moment, mais elle pourrait être disponible à nouveau dans le futur. |
| 405 | Method Not Allowed | Signifie que la requête a été faite sur une page qui utilise une méthode de requête non prise en charge pour cette page. |
| 406 | Not Acceptable | Signifie que le serveur ne peut générer qu'une réponse que le client n'accepte pas. |
| 407 | Proxy Authentication Required | Signifie que le client doit d'abord s'authentifier auprès du proxy. |
| 408 | Request Timeout | Signifie que le serveur a expiré en attendant la requête. |
| 409 | Conflict | Signifie que la requête ne peut pas être complétée en raison d'un conflit dans la requête. |
| 410 | Gone | Signifie que la page demandée n'est plus disponible. |
| 411 | Length Required | Signifie que la longueur du contenu n'est pas définie et que le serveur n'acceptera pas la requête sans elle. |
| 412 | Precondition Failed | Signifie que la précondition donnée dans la requête est évaluée à faux par le serveur. |
| 413 | Request Entity Too Large | Signifie que l'entité de la requête est trop grande et que c'est pourquoi le serveur n'acceptera pas la requête. |
| 414 | Request-URI Too Long | Signifie que l'URL est trop longue et que c'est pourquoi le serveur n'acceptera pas la requête. Cela se produit quand vous convertissez une requête POST en requête GET avec de longues informations de requête. |
| 415 | Unsupported Media Type | Signifie que le type de média n'est pas pris en charge et que c'est pourquoi le serveur n'acceptera pas la requête. |
| 416 | Requested Range Not Satisfiable | Signifie que le client a demandé une partie du fichier mais que le serveur ne peut pas fournir cette partie. |
| 417 | Expectation Failed | Signifie que le serveur ne peut pas satisfaire aux exigences du champ d'en-tête de requête Expect. |
| 418 | I'm a Teapot | Un code humoristique issu de la RFC 2324 (le Hyper Text Coffee Pot Control Protocol). Ce n'est pas une vraie erreur, mais certaines API le retournent délibérément, donc vous pouvez le rencontrer en pratique. |
| 422 | Unprocessable Content | Signifie que la requête était bien formée mais contient des erreurs sémantiques qui l'empêchent d'être traitée — couramment retourné par les API lorsque les données d'un formulaire ou JSON échouent à la validation. |
| 429 | Too Many Requests | Signifie que le client a envoyé trop de requêtes dans un laps de temps donné (« limitation de débit »). La réponse inclut souvent un en-tête Retry-After indiquant combien de temps attendre avant de réessayer. |
| 451 | Unavailable For Legal Reasons | Signifie que la ressource demandée est indisponible pour des raisons légales, comme la censure ou une ordonnance de retrait (le numéro fait référence au roman Fahrenheit 451). |
Les codes non listés ici (comme 419, 420 et plusieurs dans la plage 423–431) sont rares, spécifiques à un framework ou non standard. Certains — comme 421 (Misdirected Request, utilisé en HTTP/2) et 451 ci-dessus — sont normalisés mais peu courants dans le travail quotidien.
5xx : Erreur serveur
| Code de statut | Message | Description |
|---|---|---|
| 500 | Internal Server Error | Est une erreur générique que les utilisateurs reçoivent lorsqu'il n'existe pas de message spécifique plus approprié. |
| 501 | Not Implemented | Signifie que le serveur ne reconnaît pas la méthode de requête ou qu'il ne dispose pas de la capacité de satisfaire la requête. |
| 502 | Bad Gateway | Signifie qu'un serveur agissant comme passerelle, proxy inverse ou répartiteur de charge a reçu une réponse invalide du serveur applicatif en amont — souvent parce que ce backend a planté ou a retourné une sortie malformée. |
| 503 | Service Unavailable | Signifie que le serveur est temporairement incapable de traiter la requête (surchargé ou en maintenance). Comme le 429, la réponse peut inclure un en-tête Retry-After indiquant aux clients et aux robots d'exploration quand réessayer, ce qui explique pourquoi le 503 est le code adapté au SEO à utiliser lors d'une indisponibilité planifiée. |
| 504 | Gateway Timeout | Signifie qu'un serveur agissant comme passerelle, proxy inverse ou répartiteur de charge n'a pas reçu de réponse à temps du serveur en amont. Il pointe vers un backend lent ou non réactif plutôt que vers le proxy lui-même. |
| 505 | HTTP Version Not Supported | Signifie que la version du protocole HTTP utilisée dans la requête n'est pas prise en charge par le serveur. |
| 507 | Insufficient Storage | Un code WebDAV signifiant que le serveur ne peut pas stocker la représentation nécessaire pour compléter la requête (espace de stockage insuffisant). |
| 508 | Loop Detected | Un code WebDAV signifiant que le serveur a détecté une boucle infinie lors du traitement de la requête et l'a interrompue. |
| 511 | Network Authentication Required | Signifie que le client doit s'authentifier pour accéder au réseau (souvent rencontré derrière un portail captif Wi-Fi). |
Chapitres associés
Le statut retourné par un serveur dépend souvent de la requête elle-même. Pour aller plus loin, consultez :
- Méthodes HTTP — GET, POST et autres, qui déterminent le comportement de certaines redirections (302 vs 307).
- Formulaires HTML — comment les soumissions de formulaires déclenchent des requêtes pouvant retourner 303, 422 ou 429.
- URL HTML (Uniform Resource Locators) — les adresses vers lesquelles pointent les redirections 3xx et les réponses 404.