Vai al contenuto
OneKitly

Codici di stato HTTP spiegati: quelli che davvero si confondono

Pubblicato il 29/04/2026 · 8 min di lettura · Strumenti per sviluppatori

Daniel Okonkwo

Daniel OkonkwoSviluppatore front-end e redattore Tech presso OneKitly

Performance web · Formati di file

Verificato su 2 fonti

Vedi il profilo
In breve

La prima cifra è la parte che ogni client, cache e crawler legge: 1xx informativo, 2xx successo, 3xx redirezione, 4xx la colpa è della richiesta, 5xx del server. All'interno, le distinzioni che cambiano il comportamento sono queste. 308 è un 301 con la garanzia che metodo e corpo sopravvivono alla redirezione, e 307 è un 302 con la stessa garanzia: i client vecchi trasformano un POST redirezionato in GET su 301 e 302, ed è esattamente la ragione per cui esistono 307 e 308. 401 significa che la richiesta non portava credenziali valide e deve arrivare con un header WWW-Authenticate; 403 significa che le credenziali erano valide e l'azione viene comunque rifiutata, quindi riautenticarsi non serve. 404 dice che qui non c'è nulla senza impegnarsi sul motivo; 410 dice che la risorsa è stata rimossa deliberatamente e non tornerà, ed è cacheabile per impostazione predefinita. Su 429 e 503, Retry-After è una stima che il server pubblica in secondi o come data HTTP: un'indicazione per client educati, non la promessa di tornare in orario.

301 contro 308, 302 contro 307, 401 contro 403, 404 contro 410 — più che cosa promette davvero Retry-After su un 429 o un 503. Le coppie in cui scegliere il codice sbagliato cambia il comportamento, non solo le parole.

La prima cifra è l'unica parte che alcuni client leggono

La RFC 9110 richiede che un client comprenda la classe di un codice di stato anche se non riconosce il codice stesso, e tratti qualsiasi codice ignoto come l'x00 della sua classe. Un client che non ha mai sentito parlare del 451 lo gestisce come un 400; un 599 sconosciuto viene gestito come un 500. È questa regola a rendere lo spazio estensibile, e implica anche che la classe porta quasi tutto il comportamento: le cache decidono da lì se conservare, i proxy se ritentare, i crawler se indicizzare, quasi sempre prima di analizzare qualunque cosa nel tuo corpo di risposta.

La conseguenza pratica è che restituire un 200 con l'errore descritto nel corpo mette il guasto dove nient'altro può vederlo. Il tuo controllo di disponibilità segna verde, il tuo CDN mette in cache la pagina d'errore e un motore di ricerca la indicizza come un documento reale. È il problema del soft 404 nella sua forma generale, e vale un audit, perché la correzione è una riga sul codice di stato e non qualcosa di architetturale.

Redirezioni: quali conservano il tuo POST

La griglia dei quattro codici di redirezione incrocia in realtà due domande: permanente o temporanea, e il metodo sopravvive. 301 e 308 sono permanenti, 302 e 307 temporanei; 307 e 308 sono i due che vietano al client di modificare la richiesta. MDN è netta sul perché esista la coppia più recente: il 301 richiedeva già che metodo e corpo restassero invariati, ma quel requisito era gestito male dai client vecchi, che passavano a GET. Nessuno poteva sistemare il parco installato, così sono stati coniati due codici nuovi con la garanzia scritta nella definizione.

La scelta discende quindi dal traffico. Per una pagina che riceve solo GET, il 301 va bene ed è ciò a cui i motori di ricerca sono più abituati. Per un percorso API, il bersaglio di un form o qualsiasi cosa possa ricevere POST, PUT o DELETE, usa 308 e la richiesta arriva intatta. Un avvertimento sulla permanenza: i browser mettono in cache un 301 in modo aggressivo e alcuni lo tengono molto più a lungo di quanto ti aspetti, così un 301 emesso durante un esperimento può sopravvivergli su macchine a cui non hai accesso. Servi 302 o 307 finché stai ancora decidendo.

Gli errori restituiti sbagliati più spesso

401 e 403 sono la coppia che costa più tempo di assistenza. Il 401 significa che la richiesta era priva di credenziali di autenticazione valide, e MDN nota che viene inviato con un header WWW-Authenticate che descrive lo schema atteso dal server: è un invito a riprovare con le credenziali. Il 403 è la situazione opposta: le credenziali sono perfettamente valide e il client non ha comunque il permesso per questa azione. Restituire un 401 a un utente autenticato dice al suo client di riautenticarsi, il che produrrà esattamente lo stesso rifiuto, e gli fa credere che l'accesso sia rotto quando non lo è.

404 e 410 differiscono solo nel grado di certezza, ed è proprio questo il punto. L'indicazione di MDN è esplicita: se chi gestisce il server non sa se la condizione è temporanea o permanente, deve usare 404. Il 410 si usa quando hai rimosso la cosa di proposito e non tornerà: è cacheabile per impostazione predefinita e dice ai crawler di smettere di chiedere. Retry-After, invece, è un header che porta un ritardo in secondi o una data HTTP; su un 503 stima quanto il servizio resterà non disponibile e su un 429 dice quanto attendere prima di una nuova richiesta. È un'indicazione, non un contratto, e MDN nota che il supporto nei client è disomogeneo — ma Googlebot lo rispetta, il che basta a giustificarne l'uso durante una manutenzione pianificata.

I codici che conviene azzeccare, e a cosa impegna ciascuno
CodiceNomeA cosa impegnaDove sbaglia
200OKLa richiesta è riuscita e il corpo è il risultatoRestituito con un messaggio di errore nel corpo, il che nasconde il guasto a cache, monitoraggio e crawler
301Spostato permanentementeQuesto URL è sostituito per sempre; aggiorna i tuoi linkUsato mentre si sta ancora decidendo: i browser lo mettono in cache tenacemente e i client vecchi trasformano un POST redirezionato in GET
302TrovatoVai qui per ora; continua a usare l'URL originaleUsato per uno spostamento permanente, così il vecchio URL continua ad assorbire i segnali di posizionamento
304Non modificatoLa tua copia in cache è ancora valida; non c'è corpoInviato fuori da una richiesta condizionale, o con un corpo che i client possono scartare
307Redirezione temporaneaCome 302, ma metodo e corpo non devono essere modificatiRaramente scelto, così le redirezioni temporanee rompono in silenzio i flussi basati su POST
308Redirezione permanenteCome 301, ma metodo e corpo non devono essere modificatiTrascurato per gli endpoint API, dove un 301 declassa in silenzio un POST a GET
401Non autenticatoNon sono state fornite credenziali valide; un header WWW-Authenticate dice cosa ci si aspettaRestituito a un utente già autenticato ma senza diritto: quel caso è 403
403VietatoL'identità è accettata e l'azione è comunque rifiutataUsato come categoria tuttofare, invitando i client a ritentare un'autenticazione che non servirà mai
404Non trovatoNon c'è nulla a questo URL e il server non dice se è definitivoSostituito da una pagina gentile servita con 200, il soft 404 che tiene indicizzati URL morti
410ScomparsoRimosso deliberatamente e non tornerà; cacheabile per impostazione predefinitaQuasi mai usato, anche quando la rimozione era voluta e 404 dice troppo poco
429Troppe richiesteÈ stato raggiunto un limite di frequenza; Retry-After dice quanto attendere prima di una nuova richiestaInviato senza Retry-After, lasciando i client a indovinare e martellare l'endpoint
500Errore interno del serverIl server ha fallito e non ha nulla di più specifico da direRestituito per una richiesta errata del client, che appartiene invece alla fascia 400
502Gateway non validoUn proxy ha ricevuto una risposta non valida dal server a cui ha inoltratoAnalizzato nell'applicazione, mentre il guasto sta tra il proxy e il servizio a monte
503Servizio non disponibileTemporaneamente incapace di servire; Retry-After stima quanto durerà l'interruzioneSostituito da un 500 durante una manutenzione pianificata, così i crawler prendono l'interruzione per un guasto reale
Riferimento dei codici di stato HTTPCerca e sfoglia tutti i codici di stato HTTP standard per classe, con nome e una descrizione di una riga.Prova lo strumento

Domande frequenti

Una migrazione di sito deve usare 301 o 308?
Per pagine richieste solo con GET, il 301 è il valore sicuro e quello che ogni crawler e proxy gestisce da decenni. Ricorri al 308 per tutto ciò che può ricevere POST, PUT o DELETE — endpoint di form, rotte API, ricevitori di webhook — perché è lì che un client che declassa il metodo in silenzio trasforma una redirezione in un corpo di richiesta perduto. Nulla vieta di usarli entrambi nella stessa migrazione, rotta per rotta.
Cosa deve restituire un'API quando la validazione fallisce?
Usa 400 Bad Request quando la richiesta stessa è malformata e il server non riesce ad analizzarla: JSON rotto, un header obbligatorio mancante. Usa 422 Unprocessable Content quando la sintassi è corretta ma il contenuto viola le tue regole, come un corpo ben formato con una data di fine precedente a quella di inizio. Ciò che non devi restituire è un 500, che addossa al server un errore del client e inquina il tuo budget di errore, né un 200 con il problema descritto nel corpo, che nasconde il guasto a ogni strato tra te e il chiamante.
I 404 danneggiano il posizionamento?
Un 404 è una risposta valida e onesta, e una parte normale di qualsiasi sito che esista da un po'; una pagina che non c'è più deve dirlo. Il danno viene dai sostituti. Un soft 404 — una pagina gentile servita con stato 200 — tiene URL morti nell'indice e spende budget di scansione per nulla. Reindirizzare in blocco ogni pagina mancante alla homepage è lo stesso errore travestito da 301. Se la rimozione è stata deliberata e permanente, il 410 lo dice con chiarezza.

Articoli che potrebbero interessarti

Tutte le guide
TutorialCome scrivere un'espressione cron: cinque campi e la regola OR di cui nessuno parlaMinuto, ora, giorno del mese, mese, giorno della settimana. Le trappole: un passo è un'andatura dentro un intervallo e non una cadenza, e i due campi del giorno si combinano con OR — quindi 0 0 1 * 1 scatta il giorno 1 e ogni lunedì.TutorialCome scrivere un robots.txt: direttive, corrispondenza e ciò che non può nascondereQuattro direttive, due caratteri jolly, un file nella radice dell'host. È un'istruzione di scansione e nulla più: non toglie una pagina dai risultati, non limita l'accesso e pubblica ogni percorso che vi elenchi.SpiegazioneCome funzionano i permessi dei file Unix: leggere 755 senza tirare a indovinareLettura 4, scrittura 2, esecuzione 1, e ciascuna delle tre cifre descrive un soggetto diverso. Ciò che quasi tutte le spiegazioni sbagliano è cosa fa il bit di esecuzione su una directory: concede l'attraversamento, non il diritto di eseguire qualcosa.ConfrontocamelCase, snake_case, kebab-case: quale usare, e perché raramente scegli tuLe convenzioni non sono gusto. Il trattino è l'operatore meno, quindi kebab-case non può essere un identificatore nella maggior parte dei linguaggi: ecco perché lo usano CSS e URL. In più, il viaggio di andata e ritorno sugli acronimi che corrompe i nomi in silenzio, e la regola che lo risolve.SpiegazionePunto e virgola, tab, barra verticale: scegliere un delimitatore che sopravviva al viaggioPerché la lingua di chi legge decide il delimitatore, che cosa fa il convertitore alle virgolette quando cambi, che cos'è davvero la prima riga sep=, e il conteggio delle celle citate sullo stesso export scritto in cinque modi.TutorialBasi delle regex: guida per principiantiUn'espressione regolare è un modello per cercare testo. Ecco i mattoni — classi di caratteri, quantificatori e ancore — con un esempio.

Strumenti correlati

Fonti

Hai notato un errore in questo articolo?

Codici di stato HTTP spiegati: quelli che davvero si confondono — OneKitly