Codici di stato HTTP — Elenco completo con significati ed esempi
Tutti i codici di stato HTTP ufficiali da 100 a 511, più i codici di nginx, Cloudflare e AWS, con quando usare ciascuno.
1xx Informativi
100Continue
Risposta intermedia: il server ha ricevuto gli header della richiesta e il client può procedere a inviare il body.
Inviato automaticamente dai server quando un client include "Expect: 100-continue" prima di caricare un body di grandi dimensioni, così il client non spreca banda per una richiesta che verrebbe rifiutata.
Non inviarlo dal codice dell'applicazione come stato finale: non è mai la risposta a una richiesta, solo un passaggio prima di quella vera.
Non applicabile
PUT /upload HTTP/1.1 Content-Length: 104857600 Expect: 100-continue HTTP/1.1 100 Continue
101Switching Protocols
Il server accetta di passare la connessione al protocollo indicato nell'header Upgrade.
La risposta di handshake per le connessioni WebSocket (Upgrade: websocket) e, storicamente, per gli upgrade da HTTP/1.1 a h2c.
HTTP/2 e HTTP/3 non lo usano; i WebSocket su HTTP/2 usano invece il metodo CONNECT esteso (RFC 8441).
Non applicabile
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
102ProcessingDeprecato
Risposta intermedia che comunica al client che il server sta ancora lavorando su una lunga richiesta WebDAV, quindi non deve andare in timeout.
WebDAV. Rimosso da WebDAV nella RFC 4918 ma ancora presente nel registro IANA.
Solo nei vecchi server WebDAV che gestiscono operazioni ricorsive lente, come un COPY o MOVE profondo.
Le nuove API dovrebbero invece restituire 202 Accepted con un URL di stato per le operazioni lunghe.
Non applicabile
HTTP/1.1 102 Processing
103Early Hints
Risposta intermedia con header Link, così il browser può iniziare il preload o il preconnect mentre il server prepara ancora la risposta finale.
Quando la generazione dell'HTML richiede tempo (rendering lato server, query al database) e sai di quali CSS, font od origini ha bisogno la pagina. I browser Chromium e Firefox seguono i suggerimenti di preload e preconnect nelle risposte 103; Safari segue il preconnect.
Non inserire header che devono valere solo per la risposta finale, come Set-Cookie: i browser ignorano la maggior parte degli header nelle 103.
Non applicabile
HTTP/1.1 103 Early Hints Link: </style.css>; rel=preload; as=style Link: <https://cdn.example.com>; rel=preconnect HTTP/1.1 200 OK Content-Type: text/html
104Upload Resumption Supported
Risposta intermedia che comunica al client che il caricamento avviato può essere ripreso in seguito, e dove.
Registrazione IANA temporanea per la bozza IETF sui caricamenti riprendibili; non è ancora una RFC definitiva.
Sperimentale: i server che implementano la bozza sui caricamenti riprendibili lo inviano con un header Location che punta alla risorsa del caricamento.
Non adatto all'uso generale finché la bozza non sarà pubblicata come RFC; la maggior parte di client e proxy non lo conosce.
Non applicabile
draft-ietf-httpbis-resumable-upload
HTTP/1.1 104 Upload Resumption Supported Upload-Draft-Interop-Version: 6 Location: https://example.com/upload/b530ce8ff
2xx Successo
200OKMemorizzabile in cache per impostazione predefinita
La richiesta è riuscita. Il contenuto del body dipende dal metodo: la risorsa per GET, il risultato dell'azione per POST.
La normale risposta di successo per GET, e per POST, PUT, PATCH o DELETE quando restituisci un body che descrive il risultato.
Non restituire 200 con un messaggio di errore nel body ("soft error"). Client, monitoraggio, cache e motori di ricerca leggono il codice di stato, non il tuo JSON.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 42, "name": "Ada"}201Created
La richiesta è riuscita e ha creato una o più nuove risorse.
Dopo un POST (o un PUT su un nuovo URL) che crea qualcosa. Includi un header Location che punta alla nuova risorsa; di solito il body la descrive.
Non usarlo quando non è stato creato nulla di nuovo, ad esempio per l'aggiornamento di un record esistente (usa 200 o 204).
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 201 Created
Location: /users/42
Content-Type: application/json
{"id": 42}202Accepted
La richiesta è stata accettata per l'elaborazione, ma l'elaborazione non è terminata e potrebbe ancora fallire.
Lavori in coda o asincroni: codifica video, generazione di report, importazioni in blocco. Restituisci un link dove il client può controllare lo stato del job.
Non usarlo per indicare "successo" in operazioni sincrone: per definizione non promette nulla sull'esito.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 202 Accepted
Location: /jobs/7f3a
Content-Type: application/json
{"status": "queued"}203Non-Authoritative InformationMemorizzabile in cache per impostazione predefinita
Successo, ma un proxy di trasformazione ha modificato la risposta 200 del server di origine.
Solo da parte di intermediari che modificano il contenuto, come un proxy che comprime le immagini o riscrive l'HTML, per comunicare al client che non si tratta della risposta esatta dell'origine.
I server di origine e le API non dovrebbero inviarlo.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 203 Non-Authoritative Information Content-Type: image/webp
204No ContentMemorizzabile in cache per impostazione predefinita
Successo, e il body è volutamente assente.
Un DELETE riuscito, PUT o PATCH quando non restituisci la risorsa aggiornata, il salvataggio automatico di un modulo o la risposta a un preflight CORS.
Non includere mai un body: i client non lo leggono e in HTTP/1.1 un body indesiderato corrompe la risposta successiva sulla connessione. Usa 200 se hai qualcosa da restituire.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 204 No Content
205Reset Content
Successo; il client dovrebbe reimpostare la vista del documento, ad esempio svuotare il modulo appena inviato.
Interfacce di inserimento dati in cui l'utente invia un modulo e inserisce subito un altro record.
I browser non implementano il comportamento di reset, quindi in pratica funziona come 204. Non deve includere un body.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 205 Reset Content
206Partial ContentMemorizzabile in cache per impostazione predefinita
Il server restituisce solo gli intervalli di byte richiesti dal client con un header Range.
Avanzamento rapido in video e audio, download riprendibili e download manager che scaricano un file in parti parallele. Includi Content-Range.
Non inviarlo se la richiesta non conteneva un header Range che stai rispettando. Se ignori Range, invia 200 con il body completo.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
GET /video.mp4 HTTP/1.1 Range: bytes=0-1023 HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024
207Multi-Status
Il body (XML) contiene uno stato separato per ciascuna di più risorse.
WebDAV
Operazioni WebDAV come PROPFIND che agiscono su molte risorse. Alcune API JSON lo prendono in prestito per gli endpoint batch.
Per le API batch molti team preferiscono 200 con risultati per singolo elemento, perché i client generici trattano 207 come un semplice successo.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 207 Multi-Status Content-Type: application/xml; charset="utf-8"
208Already Reported
Usato all'interno di una risposta 207 per indicare che una risorsa è già stata elencata in precedenza e quindi non viene ripetuta (evita cicli con i binding).
WebDAV
Server WebDAV che supportano i binding (RFC 5842).
Non ha senso come risposta di primo livello al di fuori di WebDAV.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
<D:status>HTTP/1.1 208 Already Reported</D:status>
226IM Used
Il server ha soddisfatto un GET con un delta (instance manipulation) applicato alla risorsa corrente invece della risorsa completa.
Delta encoding per HTTP (header A-IM / IM). Raramente adottato.
Non supportato dai browser; non usarlo nelle normali API.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 226 IM Used IM: vcdiff ETag: "v2"
3xx Reindirizzamento
300Multiple ChoicesMemorizzabile in cache per impostazione predefinita
La risorsa ha più rappresentazioni e il client (o l'utente) dovrebbe sceglierne una.
Raro: negoziazione del contenuto guidata dal client, ad esempio offrire un documento in più lingue o formati con un link a ciascuno.
I browser non scelgono automaticamente. Per scegliere lingua o formato funziona meglio la negoziazione lato server o una normale pagina con i link.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 300 Multiple Choices Link: </doc.en.html>; rel=alternate; hreflang=en Link: </doc.fr.html>; rel=alternate; hreflang=fr
301Moved PermanentlyMemorizzabile in cache per impostazione predefinita
La risorsa ha un nuovo URL permanente, indicato nell'header Location.
Cambi di dominio, passaggio da HTTP a HTTPS, slug modificati, consolidamento di URL duplicati. I motori di ricerca trasferiscono i segnali di ranking al nuovo URL.
I browser possono trasformare un POST in GET quando seguono un 301. Se il metodo deve essere mantenuto (un endpoint API spostato), usa 308. I browser memorizzano i 301 in cache in modo aggressivo, quindi fai dei test prima del deploy.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 301 Moved Permanently Location: https://www.example.com/new-page
302Found
La risorsa si trova temporaneamente a un URL diverso; in futuro continua a usare l'URL originale.
Reindirizzamenti temporanei: redirect al login, test A/B, pagine di manutenzione, redirect per area geografica o lingua.
I browser trasformano un POST in GET quando seguono un 302 (comportamento storico consentito dalla RFC). Usa 303 per "vai a vedere il risultato" dopo un POST e 307 quando il metodo va mantenuto.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 302 Found Location: /login?next=%2Faccount
303See Other
Reindirizza il client a un altro URL, che deve richiedere con GET.
Il pattern Post/Redirect/Get: dopo il POST di un modulo, invia 303 verso la pagina del risultato, così ricaricare la pagina non reinvia il modulo.
Non serve per contenuti spostati: non dice nulla sul fatto che l'URL originale sia stato spostato.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 303 See Other Location: /orders/1234
304Not Modified
Risposta a un GET o HEAD condizionale (If-None-Match o If-Modified-Since): la copia in cache del client è ancora valida.
Riconvalida della cache: non viene memorizzato a sua volta, ma aggiorna la risposta in cache che il client possiede già.
Inviato automaticamente da server e CDN quando l'ETag o la data Last-Modified corrispondono, evitando di trasferire un body invariato.
Non inviare mai un body. Non inviarlo in risposta a una richiesta non condizionale: il client non ha nulla da riutilizzare.
Non applicabile
GET /app.js HTTP/1.1 If-None-Match: "33a64df5" HTTP/1.1 304 Not Modified ETag: "33a64df5" Cache-Control: max-age=3600
305Use ProxyDeprecato
Deprecato. Un tempo indicava al client di ripetere la richiesta tramite un proxy indicato in Location.
Niente. È stato deprecato per motivi di sicurezza e i browser lo ignorano.
Non inviarlo.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 305 Use Proxy
306(Unused)Deprecato
Riservato. Era usato in una bozza per "Switch Proxy" e non è più in uso.
Niente.
Non inviarlo.
Non applicabile
307Temporary Redirect
Reindirizzamento temporaneo in cui il client deve ripetere la richiesta con lo stesso metodo e lo stesso body.
Reindirizzare temporaneamente richieste POST, PUT o DELETE (un endpoint API spostato per manutenzione). I browser mostrano anche un 307 interno quando HSTS impone HTTPS.
Per uno spostamento permanente usa 308. Per "vai a prendere il risultato con GET" usa 303.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 307 Temporary Redirect Location: https://api2.example.com/v1/orders
308Permanent RedirectMemorizzabile in cache per impostazione predefinita
Reindirizzamento permanente in cui il client deve ripetere la richiesta con lo stesso metodo e lo stesso body.
Un endpoint API spostato in modo permanente che riceve POST o PUT. I motori di ricerca lo trattano come un 301. Next.js e Vercel usano 308 per i redirect permanenti per impostazione predefinita.
I client molto vecchi (Internet Explorer su Windows 7 e precedenti) non lo capiscono; per il semplice spostamento di pagine 301 va altrettanto bene.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 308 Permanent Redirect Location: https://example.com/api/v2/upload
4xx Errore del client
400Bad Request
Il server non elaborerà la richiesta a causa di un errore del client: sintassi malformata, framing non valido o parametri non validi.
JSON non analizzabile, un parametro obbligatorio mancante, un valore del tipo sbagliato. Spiega il problema nel body (problem+json della RFC 9457 è un buon formato).
Per input ben formati che violano le regole di business molte API usano 422. Per problemi di autenticazione usa 401 o 403.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{"title": "Invalid JSON", "detail": "Unexpected token } at position 41"}401Unauthorized
Alla richiesta mancano credenziali di autenticazione valide. Nonostante il nome, significa "non autenticato".
Nessun token, un token scaduto o una password errata. La risposta deve includere un header WWW-Authenticate che descrive come autenticarsi.
Se l'utente ha effettuato l'accesso ma non è autorizzato, usa 403. Non inviare 401 senza WWW-Authenticate.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="api", error="invalid_token"
402Payment Required
Riservato per uso futuro. Non ha una semantica standard.
Alcune API lo usano per "quota esaurita, passa a un piano superiore" o per un pagamento non riuscito (Stripe restituisce 402 per le richieste con carta rifiutata).
Non contare sul fatto che i client lo capiscano; descrivi il problema nel body.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 402 Payment Required
Content-Type: application/json
{"error": "card_declined"}403Forbidden
Il server ha capito la richiesta e sa chi sei (o non gli interessa), ma si rifiuta di soddisfarla.
L'utente autenticato non ha i permessi, un IP è bloccato, l'elenco delle directory è disattivato o è scattata una regola del WAF. Autenticarsi di nuovo non serve.
Se le credenziali mancano o non sono valide, usa 401. Se rivelare l'esistenza della risorsa è già di per sé una fuga di informazioni, restituisci invece 404.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error": "You do not have access to this project"}404Not FoundMemorizzabile in cache per impostazione predefinita
Il server non ha una rappresentazione attuale per l'URL, oppure non vuole dire se ne esiste una.
URL sconosciuti, record eliminati quando non tieni traccia delle eliminazioni, o per nascondere risorse agli utenti non autorizzati.
Se la risorsa esisteva ed è sparita per sempre, 410 lo dichiara esplicitamente. Non restituire una pagina 200 che dice "non trovato" (soft 404).
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 404 Not Found Content-Type: text/html
405Method Not AllowedMemorizzabile in cache per impostazione predefinita
L'URL esiste, ma non supporta questo metodo HTTP.
Un DELETE su una risorsa di sola lettura o un POST su una pagina solo GET. La risposta deve includere un header Allow con l'elenco dei metodi supportati.
Non usarlo per problemi di permessi (403) né per metodi che il server non implementa affatto (501).
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 405 Method Not Allowed Allow: GET, HEAD
406Not Acceptable
Il server non può produrre una risposta che corrisponda agli header Accept, Accept-Language o Accept-Encoding della richiesta.
Un'API che parla solo JSON e riceve "Accept: application/xml" senza alternative.
La maggior parte dei server ignora gli header Accept non soddisfatti e invia il formato predefinito, che di solito è una scelta più amichevole.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{"supported": ["application/json"]}407Proxy Authentication Required
Come 401, ma il client deve autenticarsi presso il proxy intermedio.
Inviato dai forward proxy (proxy aziendali), con un header Proxy-Authenticate.
I server di origine non dovrebbero mai inviarlo.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 407 Proxy Authentication Required Proxy-Authenticate: Basic realm="corp-proxy"
408Request Timeout
Il server non ha ricevuto una richiesta completa entro il tempo che era disposto ad attendere e sta chiudendo la connessione.
Inviato dai server su connessioni keep-alive inattive o caricamenti lenti. I client possono ripetere la richiesta su una nuova connessione.
Non per un'elaborazione lenta nel back-end: quello è un 504 su un gateway o semplicemente una risposta lenta. Invialo insieme a "Connection: close".
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 408 Request Timeout Connection: close
409Conflict
La richiesta è in conflitto con lo stato attuale della risorsa.
Creare un utente con un'email già esistente, modificare un record cambiato da qualcun altro (versione non corrispondente), eliminare una cartella non vuota.
Per condizioni If-Match / If-Unmodified-Since non soddisfatte usa 412. Per errori di validazione usa 400 o 422.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error": "Email already registered"}410GoneMemorizzabile in cache per impostazione predefinita
La risorsa esisteva qui, è sparita in modo permanente e non ha un indirizzo di inoltro.
Prodotti fuori produzione, promozioni scadute, account eliminati, versioni di API dismesse. Google tratta 404 e 410 quasi allo stesso modo, anche se un 410 potrebbe essere rimosso dall'indice un po' prima.
Se il contenuto è stato spostato, reindirizza invece con 301. Se non sei sicuro che sia permanente, usa 404.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 410 Gone
411Length Required
Il server richiede un header Content-Length in questa richiesta.
Server che rifiutano i caricamenti chunked e devono conoscere in anticipo la dimensione del body.
Raramente necessario nelle applicazioni; di solito è generato direttamente dal web server.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 411 Length Required
412Precondition Failed
Una condizione negli header della richiesta (If-Match, If-Unmodified-Since, If-None-Match in scrittura) è risultata falsa.
Concorrenza ottimistica: il client ha inviato If-Match con un vecchio ETag, quindi qualcun altro ha modificato la risorsa prima.
Non usarlo per violazioni delle regole di business che non c'entrano con gli header condizionali (409 o 422).
Memorizzabile in cache solo con Cache-Control o Expires espliciti
PUT /docs/7 HTTP/1.1 If-Match: "v3" HTTP/1.1 412 Precondition Failed ETag: "v4"
413Content Too Large
Il body della richiesta è più grande di quanto il server sia disposto a elaborare. Chiamato "Payload Too Large" prima della RFC 9110.
Caricamenti oltre il limite (client_max_body_size di nginx, un tetto di 10 MB in un'API). Se il limite è temporaneo, aggiungi Retry-After.
Per un URL troppo lungo usa 414; per header troppo grandi usa 431.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 413 Content Too Large Connection: close
414URI Too LongMemorizzabile in cache per impostazione predefinita
Il target della richiesta (URL) è più lungo di quanto il server sia disposto a interpretare.
Query string enormi, spesso un modulo GET che dovrebbe essere un POST, o un loop di redirect che continua ad aggiungere parametri.
Sposta gli input voluminosi nel body di una richiesta (POST) invece di alzare il limite all'infinito.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 414 URI Too Long
415Unsupported Media Type
Il server rifiuta la richiesta perché il formato del body (Content-Type o Content-Encoding) non è supportato.
Un endpoint che accetta JSON e riceve dati di un modulo o XML, oppure un header Content-Type mancante. Includi Accept-Post o Accept-Patch per indicare cosa è supportato.
Non per un body nel formato giusto ma con contenuto non valido (400 o 422).
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 415 Unsupported Media Type Accept-Post: application/json
416Range Not Satisfiable
Nessuno degli intervalli di byte nell'header Range si sovrappone alla risorsa, ad esempio richiedendo byte oltre la fine del file.
Download ripresi in cui il file si è ridotto o il client chiede oltre la sua fine. Includi Content-Range: bytes */<length>.
I server possono anche semplicemente ignorare un Range non valido e restituire 200 con il body completo, anche questo è consentito.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 416 Range Not Satisfiable Content-Range: bytes */47022
417Expectation Failed
Il server non può soddisfare il requisito indicato nell'header Expect della richiesta.
Un client ha inviato "Expect: 100-continue" a un server o proxy che non lo supporta, oppure un'aspettativa sconosciuta.
I client che lo ricevono dovrebbero riprovare senza l'header Expect.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 417 Expectation Failed
418(Unused)
Riservato dalla RFC 9110 perché 418 era molto diffuso come codice scherzoso “I’m a teapot”; in HTTP non ha un significato definito.
Riservato. Famoso come “I’m a teapot” dalla RFC 2324 (HTCPCP), un pesce d'aprile del 1998.
Solo come easter egg. Alcuni servizi lo usano per rispondere in modo spiritoso alle richieste che vogliono rifiutare.
Non usarlo per errori reali: non gli si può assegnare un significato e i client non sapranno cosa fare.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 418 I'm a teapot
419Page ExpiredNon ufficiale · Laravel
Laravel lo restituisce quando il token CSRF manca o è scaduto, di solito dopo il timeout della sessione su una pagina con un modulo.
Inviato dal middleware CSRF di Laravel. Si risolve ricaricando la pagina, includendo @csrf nei moduli o inviando l'header X-CSRF-TOKEN con le richieste AJAX.
Non è un codice standard; non inviarlo da API non Laravel.
Non applicabile
Laravel (non presente nel registro IANA)
HTTP/1.1 419 unknown status
420Enhance Your CalmNon ufficiale · Twitter (legacy)
La risposta di rate limit della vecchia API di Twitter, sostituita dal codice standard 429.
Niente di nuovo. Potresti ancora trovarlo in vecchie librerie client. Spring aveva definito 420 "Method Failure", ora deprecato.
Usa 429 per il rate limiting.
Non applicabile
Twitter API v1 (non presente nel registro IANA)
HTTP/1.1 420 Enhance Your Calm
421Misdirected Request
La richiesta ha raggiunto un server che non può produrre una risposta per quell'host e quello schema.
Il connection coalescing di HTTP/2 non è andato a buon fine: il browser ha riutilizzato una connessione per un altro hostname coperto dallo stesso certificato, ma il server non lo serve. Il client dovrebbe riprovare su una nuova connessione.
Non per i normali hostname sconosciuti su un singolo server; in quel caso di solito si ha un 404 o il virtual host predefinito.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/2 421
422Unprocessable Content
La richiesta è ben formata e in un formato supportato, ma il suo contenuto non supera la validazione. Chiamato "Unprocessable Entity" nella RFC 4918.
Errori di validazione di moduli e API: un'email che non è un'email, una data di fine precedente alla data di inizio. Rails, Laravel e FastAPI lo usano per impostazione predefinita.
Per una sintassi malformata (JSON non analizzabile) usa 400.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json
{"errors": {"email": ["is invalid"]}}423Locked
La risorsa è bloccata, quindi la richiesta non può modificarla.
WebDAV
Semantica LOCK di WebDAV. Alcune API lo usano per record in modifica da parte di qualcun altro o per account bloccati dopo tentativi di accesso falliti.
Al di fuori di WebDAV, 409 è compreso meglio dai client generici.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 423 Locked
424Failed Dependency
L'azione non è riuscita perché è fallita un'altra azione da cui dipendeva.
WebDAV
In un PROPPATCH WebDAV o in una richiesta batch, gli elementi non tentati perché un elemento precedente è fallito.
Non per i guasti dei servizi a monte: quelli sono 502 o 503.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 424 Failed Dependency
425Too Early
Il server non elaborerà una richiesta inviata come early data TLS 1.3 (0-RTT) perché potrebbe essere ripetuta da un attaccante (replay).
CDN e server che accettano 0-RTT ma rifiutano le richieste non idempotenti (POST) negli early data. Il client riprova dopo il completamento dell'handshake.
Non è un codice generico "riprova più tardi"; per quello usa 503 con Retry-After.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 425 Too Early
426Upgrade Required
Il server rifiuta la richiesta con il protocollo attuale, ma la accetterebbe dopo un upgrade indicato nell'header Upgrade.
Per richiedere TLS o un protocollo più recente, o quando un endpoint WebSocket riceve una semplice richiesta HTTP. Deve includere un header Upgrade.
Per passare da HTTP a HTTPS sui siti web, l'approccio abituale è un redirect 301 o 308 più HSTS.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 426 Upgrade Required Upgrade: TLS/1.3, HTTP/1.1 Connection: Upgrade
428Precondition Required
Il server richiede che la richiesta sia condizionale (If-Match ecc.), per evitare aggiornamenti persi.
API che pretendono che i client inviino If-Match con l'ultimo ETag visto prima di un PUT, PATCH o DELETE.
Usa 412 quando una precondizione è stata inviata e non è soddisfatta; 428 è per quando non ne è stata inviata nessuna.
Non deve essere memorizzato dalle cache
HTTP/1.1 428 Precondition Required
Content-Type: application/json
{"error": "Send If-Match with the current ETag"}429Too Many Requests
Il client ha inviato troppe richieste in un dato intervallo di tempo (rate limiting).
Limiti di frequenza delle API, limitazione dei tentativi di login, protezione dallo scraping. Includi Retry-After, così i client corretti sanno quando tornare; anche gli header RateLimit aiutano.
Per un server sovraccarico per tutti, usa 503. Googlebot tratta 429 come 503 e rallenta la scansione.
Non deve essere memorizzato dalle cache
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{"error": "Rate limit exceeded: 100 requests per minute"}431Request Header Fields Too Large
Gli header, singolarmente o nel complesso, sono troppo grandi per il server.
Di solito cookie troppo grandi accumulati su un dominio, o token Authorization enormi. Cancellare i cookie spesso risolve il problema per gli utenti.
Per un URL lungo usa 414; per un body grande usa 413.
Non deve essere memorizzato dalle cache
HTTP/1.1 431 Request Header Fields Too Large
440Login Time-outNon ufficiale · Microsoft IIS / Exchange
La sessione del client è scaduta e deve effettuare di nuovo l'accesso (Outlook Web Access e altre app IIS).
Si incontra negli ambienti Exchange/OWA.
Nelle tue app usa 401 per le sessioni scadute.
Non applicabile
Microsoft IIS (non presente nel registro IANA)
HTTP/1.1 440 Login Time-out
444No ResponseNon ufficiale · nginx
Codice interno di nginx: "return 444;" chiude la connessione senza inviare alcuna risposta.
Per scartare le richieste degli scanner, le richieste con header Host sconosciuti in un blocco server predefinito o i client abusivi. Compare nei log di nginx; il client vede una risposta vuota.
Il client non riceve mai un 444, quindi non è qualcosa da gestire nel codice client.
Non applicabile
nginx (non presente nel registro IANA)
server {
listen 80 default_server;
return 444;
}449Retry WithNon ufficiale · Microsoft
Estensione Microsoft: la richiesta va ripetuta dopo che il client ha eseguito un'azione specifica.
Si incontra in alcuni servizi Microsoft (Exchange ActiveSync; Azure Cosmos DB usa 449 per i conflitti di scrittura ripetibili).
Non standard; nelle tue API usa 409 o 503 con Retry-After.
Non applicabile
Microsoft IIS (non presente nel registro IANA)
HTTP/1.1 449 Retry With
450Blocked by Windows Parental ControlsNon ufficiale · Microsoft
Il Controllo genitori di Windows ha bloccato l'accesso alla pagina.
Generato sui sistemi Windows con il controllo genitori attivo.
Non inviarlo dai server.
Non applicabile
Microsoft (non presente nel registro IANA)
HTTP/1.1 450 Blocked by Windows Parental Controls
451Unavailable For Legal ReasonsMemorizzabile in cache per impostazione predefinita
L'accesso è negato per un obbligo legale: un ordine del tribunale, una censura governativa o una restrizione geografica per motivi legali.
Contenuti bloccati in una giurisdizione (sanzioni, blocchi geografici legati al GDPR, ordini di rimozione). Un header Link con rel="blocked-by" può indicare chi ha imposto il blocco.
Non per i normali dinieghi di permesso (403) né per contenuti che hai semplicemente deciso di rimuovere (410).
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 451 Unavailable For Legal Reasons Link: <https://authority.example/>; rel="blocked-by"
460Client closed connection (AWS ELB)Non ufficiale · AWS Application Load Balancer
Registrato da un AWS ALB quando il client ha chiuso la connessione prima della scadenza dell'idle timeout.
Si vede nei log di accesso dell'ALB; di solito indica un client con un timeout più breve del tempo di elaborazione del target.
Non viene inviato ai client.
Non applicabile
AWS Elastic Load Balancing (non presente nel registro IANA)
elb_status_code=460
463Too many IPs in X-Forwarded-For (AWS ELB)Non ufficiale · AWS Application Load Balancer
L'ALB ha ricevuto un header X-Forwarded-For con più di 30 indirizzi IP.
Di solito è un loop di proxy che continua ad aggiungere indirizzi.
Non per l'uso nelle applicazioni.
Non applicabile
AWS Elastic Load Balancing (non presente nel registro IANA)
HTTP/1.1 463
494Request Header Too LargeNon ufficiale · nginx
Codice interno di nginx per header che superano large_client_header_buffers; il client riceve un 400.
Compare nei log di nginx e nella configurazione di error_page.
Il codice standard è 431.
Non applicabile
nginx (non presente nel registro IANA)
error_page 494 /header-too-large.html;
495SSL Certificate ErrorNon ufficiale · nginx
Interno di nginx: il client ha presentato un certificato client non valido (TLS reciproco). Inviato al client come 400.
Pagine di errore personalizzate per i fallimenti mTLS.
Non è un codice di stato trasmesso in rete.
Non applicabile
nginx (non presente nel registro IANA)
error_page 495 /bad-client-cert.html;
496SSL Certificate RequiredNon ufficiale · nginx
Interno di nginx: era richiesto un certificato client ma non è stato fornito. Inviato al client come 400.
Pagine di errore personalizzate quando ssl_verify_client è attivo.
Non è un codice di stato trasmesso in rete.
Non applicabile
nginx (non presente nel registro IANA)
error_page 496 /client-cert-required.html;
497HTTP Request Sent to HTTPS PortNon ufficiale · nginx
Interno di nginx: una semplice richiesta HTTP è arrivata su una porta che si aspetta TLS. Inviato al client come 400.
Un trucco comune è "error_page 497 =301 https://$host$request_uri;" per reindirizzare queste richieste a HTTPS.
Non è un codice di stato trasmesso in rete.
Non applicabile
nginx (non presente nel registro IANA)
error_page 497 =301 https://$host:$server_port$request_uri;
498Invalid TokenNon ufficiale · Esri ArcGIS Server
ArcGIS lo restituisce per un token scaduto o comunque non valido.
Rilevante solo quando si chiamano i servizi ArcGIS.
Nelle tue API usa 401 per i token non validi.
Non applicabile
Esri ArcGIS (non presente nel registro IANA)
HTTP/1.1 498 Invalid Token
499Client Closed RequestNon ufficiale · nginx
nginx registra 499 quando il client ha chiuso la connessione prima che nginx inviasse una risposta.
Si vede nei log di accesso: utenti che cambiano pagina, client mobili in timeout o un load balancer davanti a nginx con un timeout più breve. Molti 499 su un endpoint di solito indicano che è troppo lento.
Il client non lo riceve mai. Esri usa 499 anche per "Token Required".
Non applicabile
nginx (non presente nel registro IANA)
203.0.113.9 - - [16/Oct/2026:10:12:01 +0000] "GET /report HTTP/1.1" 499 0
5xx Errore del server
500Internal Server Error
Il server ha incontrato una condizione imprevista che gli ha impedito di soddisfare la richiesta.
Eccezioni non gestite e bug. È il ripiego generico quando non si applica un 5xx più specifico.
Non usarlo per errori del client (4xx). In produzione non esporre stack trace nel body; registrali nei log.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 500 Internal Server Error
Content-Type: application/problem+json
{"title": "Internal Server Error", "traceId": "4bf92f35"}501Not ImplementedMemorizzabile in cache per impostazione predefinita
Il server non supporta la funzionalità richiesta, in genere un metodo HTTP che non riconosce affatto.
Una richiesta con un metodo sconosciuto (ad es. un metodo WebDAV su un semplice web server) o una funzionalità che il server volutamente non ha ancora implementato.
Se il metodo è noto ma non consentito su questo URL, usa 405.
Memorizzabile in cache per impostazione predefinita (in modo euristico)
HTTP/1.1 501 Not Implemented
502Bad Gateway
Un gateway o un proxy ha ricevuto una risposta non valida dal server a monte.
Inviato da reverse proxy e load balancer (nginx, Cloudflare, AWS ALB) quando il server dell'applicazione si è bloccato, ha chiuso la connessione o ha restituito dati senza senso.
Il codice dell'applicazione raramente ha bisogno di inviarlo, tranne i gateway API che chiamano un altro servizio andato in errore.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 502 Bad Gateway Server: nginx
503Service Unavailable
Il server non può gestire la richiesta in questo momento: è sovraccarico o in manutenzione. La situazione dovrebbe essere temporanea.
Manutenzione programmata, riduzione del carico, interruzione di una dipendenza. Aggiungi Retry-After. Durante brevi periodi di 503 i motori di ricerca mantengono la pagina indicizzata, a differenza di una pagina di manutenzione con 200 o di un 404.
Non lasciare un sito in 503 per giorni: alla lunga Google rimuove gli URL che continuano a restituirlo.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 503 Service Unavailable Retry-After: 3600
504Gateway Timeout
Un gateway o un proxy non ha ricevuto in tempo una risposta dal server a monte.
Inviato da proxy e load balancer quando l'applicazione impiega più del timeout del proxy (proxy_read_timeout di nginx è di 60 secondi per impostazione predefinita).
Per i lavori lunghi non limitarti ad alzare i timeout: restituisci 202 ed elabora in modo asincrono.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 504 Gateway Timeout Server: awselb/2.0
505HTTP Version Not Supported
Il server non supporta la versione principale di HTTP usata nella richiesta.
Un server che riceve una versione del protocollo che non sa gestire.
Raro; i client negoziano HTTP/2 e HTTP/3 tramite ALPN e Alt-Svc anziché per tentativi.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 505 HTTP Version Not Supported
506Variant Also Negotiates
Errore di configurazione del server: la variante scelta è a sua volta configurata per negoziare, creando un ciclo.
Negoziazione trasparente del contenuto (sperimentale)
Solo server che implementano la negoziazione trasparente del contenuto della RFC 2295.
Non per gli errori dell'applicazione.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 506 Variant Also Negotiates
507Insufficient Storage
Il server non può memorizzare ciò che serve per completare la richiesta.
WebDAV
API WebDAV o di archiviazione file quando il disco o la quota dell'utente sono pieni.
Per un singolo caricamento che supera un limite di dimensione, 413 è più chiaro.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 507 Insufficient Storage
508Loop Detected
Il server ha interrotto un'operazione perché ha rilevato un ciclo infinito (binding WebDAV con Depth: infinity).
WebDAV
Server WebDAV. Anche gli hosting condivisi basati su CloudLinux inviano 508 "Resource Limit Is Reached" quando un account raggiunge i propri limiti, un uso non standard.
Non per i loop di redirect: quelli sono un errore lato client che il browser segnala da sé.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 508 Loop Detected
509Bandwidth Limit ExceededNon ufficiale · Apache bw_mod / cPanel
L'account di hosting ha superato la banda disponibile.
Pannelli di controllo degli hosting condivisi.
Nei tuoi sistemi usa 503 o 429.
Non applicabile
Apache / cPanel (non presente nel registro IANA)
HTTP/1.1 509 Bandwidth Limit Exceeded
510Not ExtendedDeprecato
La richiesta non rispettava la policy di accesso alla risorsa prevista dall'HTTP Extension Framework.
Contrassegnato come obsoleto nel registro IANA: la RFC 2774 è stata spostata tra quelle storiche (Historic).
Niente di attuale; l'extension framework non è mai stato implementato su larga scala.
Non inviarlo.
Memorizzabile in cache solo con Cache-Control o Expires espliciti
HTTP/1.1 510 Not Extended
511Network Authentication Required
Il client deve autenticarsi per ottenere l'accesso alla rete: un captive portal.
Portali Wi-Fi di hotel, aeroporti e bar che intercettano il traffico finché l'utente non effettua l'accesso o accetta le condizioni.
I server di origine non devono mai inviarlo; è riservato ai proxy di rete che intercettano il traffico.
Non deve essere memorizzato dalle cache
HTTP/1.1 511 Network Authentication Required Content-Type: text/html <meta http-equiv="refresh" content="0; url=https://login.example.net/">
520Web Server Returned an Unknown ErrorNon ufficiale · Cloudflare
L'origine ha restituito a Cloudflare una risposta vuota, sconosciuta o inattesa.
Controlla i log dell'origine: crash, connessioni reimpostate, header oltre il limite di Cloudflare o una risposta vuota.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 520 server: cloudflare
521Web Server Is DownNon ufficiale · Cloudflare
Cloudflare non è riuscita a connettersi all'origine: la connessione è stata rifiutata.
Il web server di origine è fermo, oppure un firewall blocca gli intervalli IP di Cloudflare.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 521 server: cloudflare
522Connection Timed OutNon ufficiale · Cloudflare
Cloudflare è andata in timeout nello stabilire una connessione TCP con l'origine.
Origine sovraccarica, pacchetti scartati da un firewall o un IP di origine errato nel DNS.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 522 server: cloudflare
523Origin Is UnreachableNon ufficiale · Cloudflare
Cloudflare non riesce proprio a raggiungere l'origine, di solito per un problema di routing o un record DNS errato.
Verifica che i record DNS A/AAAA puntino all'IP giusto e raggiungibile.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 523 server: cloudflare
524A Timeout OccurredNon ufficiale · Cloudflare
Cloudflare si è connessa all'origine, ma l'origine non ha inviato una risposta HTTP entro il timeout (100 secondi per impostazione predefinita).
Richieste di lunga durata: sposta il lavoro in un job in background e interrogalo periodicamente, oppure trasmetti l'avanzamento in streaming.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 524 server: cloudflare
525SSL Handshake FailedNon ufficiale · Cloudflare
L'handshake TLS tra Cloudflare e l'origine non è riuscito.
L'origine non è in ascolto sulla 443, manca il certificato, non ci sono cipher suite in comune o SNI non è configurato, mentre la modalità SSL è Full o Full (strict).
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 525 server: cloudflare
526Invalid SSL CertificateNon ufficiale · Cloudflare
In modalità Full (strict), Cloudflare non è riuscita a convalidare il certificato dell'origine: scaduto, autofirmato o con hostname errato.
Installa sull'origine un certificato valido o un certificato Cloudflare Origin CA.
Lo invia solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 526 server: cloudflare
527Railgun ErrorNon ufficiale · Cloudflare (dismesso)Deprecato
Problema di connessione tra Cloudflare e un listener Railgun sull'origine. Cloudflare ha dismesso Railgun.
Solo di interesse storico.
Lo inviava solo Cloudflare.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/1.1 527 Railgun Error
530Origin DNS / 1xxx errorNon ufficiale · Cloudflare
Restituito insieme a una pagina di errore Cloudflare 1xxx (come 1016 Origin DNS error); la vera causa è il codice 1xxx mostrato nella pagina.
Cerca il numero di errore 1xxx mostrato nella pagina.
Lo inviano solo CDN e provider di hosting.
Non applicabile
Cloudflare (non presente nel registro IANA)
HTTP/2 530 server: cloudflare
561Unauthorized (AWS ELB)Non ufficiale · AWS Application Load Balancer
L'autenticazione integrata dell'ALB (OIDC o Cognito) non è riuscita presso l'identity provider.
Controlla la configurazione dell'IdP nella regola del listener dell'ALB.
Non per l'uso nelle applicazioni.
Non applicabile
AWS Elastic Load Balancing (non presente nel registro IANA)
HTTP/1.1 561
598Network Read Timeout ErrorNon ufficiale · Alcuni proxy HTTP
Usato da alcuni proxy per segnalare un timeout di lettura a valle del proxy.
Raro; potresti vederlo con alcuni prodotti proxy.
Usa 504.
Non applicabile
Informal convention (non presente nel registro IANA)
HTTP/1.1 598
599Network Connect Timeout ErrorNon ufficiale · Alcuni proxy e client HTTP
Usato da alcuni proxy e librerie client (ad esempio il client HTTP di Tornado) per un timeout di connessione.
Raro.
Per i proxy usa 504.
Non applicabile
Informal convention (non presente nel registro IANA)
HTTP/1.1 599
Un riferimento statico che funziona nel tuo browser; le tue ricerche non vengono inviate da nessuna parte. Sfoglia tutti gli strumenti gratuiti.
Hai trovato un problema o qualcosa che potrebbe andare meglio? Leggiamo ogni messaggio e sistemiamo le cose in fretta.
Questo elenco dei codici di stato HTTP copre tutti i codici del registro IANA, da 100 Continue a 511 Network Authentication Required, con il significato, quando usarlo, quando no, se le cache possono memorizzarlo e la sezione RFC che lo definisce. Digita un numero, una classe come 4xx o una parola come "redirect" o "rate limit" per filtrare, e collegati direttamente a qualsiasi codice con un'ancora come #404 o #503.
Le voci ufficiali seguono la RFC 9110 (2022), che ha sostituito la RFC 7231 e rinominato alcuni codici: 413 ora è Content Too Large e 422 è Unprocessable Content. Sono inclusi anche i codici che vedi nei log ma non trovi nel registro, come nginx 499 o Cloudflare 522, contrassegnati come non ufficiali e con il sistema che li invia. È un riferimento, non un monitor: non recupera URL né controlla lo stato restituito da un sito online.
Come si usa
- Digita un codice (503), una classe (4xx) o una parola chiave (timeout, redirect, cache) nella casella di ricerca. I risultati si filtrano mentre scrivi.
- Usa i pulsanti delle classi per vedere solo i codici 1xx, 2xx, 3xx, 4xx o 5xx, e deseleziona "Includi i codici non ufficiali" per nascondere quelli specifici dei fornitori.
- Fai clic su un codice per espanderlo: significato, quando usarlo, quando no, comportamento in cache, RFC di riferimento e una risposta di esempio.
- Usa "Copia il link a questo codice" per condividere un link diretto come /tools/http-status-codes#429.
Domande frequenti
Qual è la differenza tra 401 e 403?
401 Unauthorized significa che la richiesta non ha credenziali valide: il client non ha effettuato l'accesso o il token è scaduto. Il server deve inviare un'intestazione WWW-Authenticate che indica come autenticarsi. 403 Forbidden significa che il server sa chi è il client, o non ha bisogno di saperlo, e rifiuta comunque; accedere di nuovo non servirà. In breve, 401 è "chi sei?" e 403 è "lo so, e la risposta è no".
Per un reindirizzamento permanente conviene usare 301 o 308?
Sono entrambi permanenti ed entrambi trasferiscono i segnali di ranking su Google. La differenza è il metodo: seguendo un 301, i browser possono trasformare un POST in un GET, mentre il 308 obbliga il client a ripetere lo stesso metodo e lo stesso corpo. Per i normali spostamenti di pagina va bene il 301; per un endpoint API che riceve POST o PUT, usa il 308. La stessa coppia esiste per i reindirizzamenti temporanei: il 302 può cambiare il metodo, il 307 no.
Che cosa significa 499 nei log di nginx?
499 Client Closed Request è un codice esclusivo di nginx. Viene registrato quando il client ha chiuso la connessione prima che nginx inviasse una risposta, quindi il client non riceve mai davvero un 499. Qualche 499 occasionale sono utenti che hanno cambiato pagina; molti su un unico endpoint di solito indicano che è troppo lento e che i client o un load balancer a monte vanno in timeout prima.
Qual è la differenza tra 502, 503 e 504?
Tutti e tre provengono da un server posto davanti a un altro. 502 Bad Gateway significa che il proxy ha ricevuto una risposta non valida o una connessione interrotta dall'applicazione a monte. 503 Service Unavailable significa che il server non è temporaneamente in grado di gestire le richieste, di solito per sovraccarico o manutenzione, e dovrebbe includere Retry-After. 504 Gateway Timeout significa che il proxy ha smesso di aspettare la risposta del server a monte.
418 I'm a teapot è un vero codice di stato?
È nato come pesce d'aprile nella RFC 2324 (1998) ed è stato implementato da abbastanza software che oggi la RFC 9110 elenca il 418 come "(Unused)": riservato, perché non gli venga mai attribuito un significato reale. Non è un errore da inviare per problemi veri, ma va benissimo tenerlo in un easter egg.
Quali codici di stato possono essere memorizzati in cache per impostazione predefinita?
La RFC 9110 indica 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 e 501 come memorizzabili in cache in modo euristico, il che significa che una cache può conservarli anche senza Cache-Control o Expires. La RFC 7725 aggiunge il 451. Gli altri codici, compresi 302 e 307, vengono memorizzati solo quando la risposta contiene informazioni esplicite di validità, e la RFC 6585 stabilisce che 428, 429, 431 e 511 non devono essere memorizzati affatto.
Le cinque classi in breve
• 1xx Informativi: risposte intermedie prima di quella finale. Raramente li gestisci direttamente; in pratica contano il 101 (upgrade a WebSocket) e il 103 (Early Hints).
• 2xx Successo: la richiesta è andata a buon fine. 200 per una risposta normale, 201 quando è stato creato qualcosa (con un'intestazione Location), 204 quando volutamente non c'è corpo.
• 3xx Reindirizzamento: il client deve cercare altrove. 301/308 per spostamenti permanenti, 302/307 per quelli temporanei, 303 dopo il POST di un modulo, 304 quando la copia in cache è ancora valida.
• 4xx Errore del client: la richiesta è sbagliata e ripeterla invariata fallirà di nuovo. 400 malformata, 401 non autenticata, 403 non consentita, 404 non trovata, 409 conflitto, 422 validazione non superata, 429 limite di richieste superato.
• 5xx Errore del server: la richiesta può essere corretta ma il server ha fallito. 500 è un bug, 502/504 sono errori tra proxy e server a monte, 503 è un'indisponibilità temporanea.
Scegliere il codice giusto in un'API
Restituisci il codice più specifico su cui un client generico può agire, e metti i dettagli nel corpo. Un client HTTP con retry, una CDN o un sistema di monitoraggio sanno cosa significano 429 e 503 senza leggere il tuo JSON, ma non possono interpretare un 200 con {"error": true}. La RFC 9457 (Problem Details) definisce una struttura JSON standard per i corpi degli errori.
Una mappatura pratica per la maggior parte delle API JSON: 400 per un input non analizzabile, 422 per un input ben formato che non supera la validazione, 401 quando il token manca o è scaduto, 403 quando l'utente non ha i permessi, 404 per ID sconosciuti (anche per nascondere risorse che un utente non può vedere), 409 per duplicati e conflitti di versione, 412 quando un ETag If-Match non è più aggiornato, 429 con Retry-After per i limiti di frequenza e 503 con Retry-After per i fermi programmati.
Non inventare nuovi numeri. I client trattano un codice sconosciuto come l'x00 della sua classe (un 4xx sconosciuto viene gestito come un 400), quindi un 461 personalizzato non ti dà nulla in più di un 400 con un messaggio chiaro.
Codici di stato e SEO
I motori di ricerca leggono i codici di stato alla lettera. Un 301 o un 308 trasferisce i segnali del vecchio URL a quello nuovo; un 302 o un 307 dice a Google di mantenere indicizzato il vecchio URL. 404 e 410 rimuovono entrambi una pagina dall'indice col tempo. Una pagina con stato 200 che dice "non trovato" è un soft 404, che Google rileva e segnala in Search Console. Per la manutenzione, un breve periodo di 503 con Retry-After mantiene intatti i posizionamenti, mentre una pagina 200 "torniamo presto" può sostituire i tuoi contenuti nei risultati di ricerca. Googlebot rallenta anche la frequenza di scansione quando riceve 429, 500 o 503.
Strumenti gratuiti correlati
- Parser di user agent — Vedi il tuo user agent e i client hint, oppure analizza qualsiasi stringa UA in browser, motore, sistema operativo, dispositivo e CPU. Modalità in blocco con CSV.
- Formattatore JSON — Formatta, minifica e valida JSON, con gli errori di parsing localizzati per riga e colonna. Nel tuo browser, senza upload.
- Docker Run ⇄ Compose — Trasforma un comando docker run in un servizio docker-compose.yml, o un servizio Compose di nuovo in docker run.
- Tester regex — Prova un'espressione regolare su un testo di esempio con evidenziazione delle corrispondenze in tempo reale, gruppi di cattura e anteprima della sostituzione. Gratis, nel browser.