304 Not Modified: guida alla cache condizionale

Che cosa significa HTTP 304 Not Modified, perché è un codice 3xx ma non un redirect, come ETag e Last-Modified lo attivano e perché può aiutare indirettamente l’efficienza del crawl sui siti grandi senza influire sul ranking.

Prima pubblicazione: 3 lug 2026 · Ultimo aggiornamento: 22 ago 2026 · Advanced
Lingue
1 segnale di evidenza in questa pagina

HTTP 304 Not Modified è la risposta a una richiesta GET o HEAD condizionale la cui condizione risulta falsa: altrimenti avrebbe ricevuto un 200. È una risposta della classe 3xx che non è un redirect: non ha header Location e, per specifica, non ha alcun body. Un GET o HEAD con If-None-Match (confrontato con un ETag) o If-Modified-Since (confrontato con Last-Modified) rende condizionale la richiesta; una seconda visita è l’esempio tipico, non la regola del protocollo. Per la SEO non c’è un effetto diretto sul ranking: Google possiede già il contenuto e un 304 conferma soltanto che nulla è cambiato, anche se Search può ancora ricalcolare i segnali di un URL. Il vantaggio reale è il risparmio di risorse: sui siti grandi con molti URL che cambiano raramente, i 304 permettono ai crawler di evitare di riscaricare pagine invariate, risparmiando banda e calcolo del server; Google dice che questo può migliorare indirettamente l’efficienza del crawl, ma non promette una riallocazione automatica del crawl budget verso altri URL. Google raccomanda ETag come validator principale (non ha problemi di formattazione delle date), supporta l’impostazione di entrambi e considera abbastanza importante da invalidare la cache solo un cambiamento effettivo del contenuto, non un anno di copyright nel footer. Non confondere 304 con 301/302/307/308, che spostano verso un URL diverso, né con 204 No Content, anch’esso senza body ma perché non c’è davvero nulla da inviare.

TL;DR — 304 è la risposta a un GET/HEAD condizionale la cui condizione risulta falsa e che altrimenti avrebbe ricevuto un 200 (RFC 9110 §15.4.5). Appartiene alla classe 3xx ma non è un redirect: niente Location, nessun nuovo URL e, normativamente, nessun body (“it cannot contain content or trailers”). La condizione è trasportata da If-None-Match (rispetto a un ETag) e/o If-Modified-Since (rispetto a Last-Modified); se il validator corrisponde ancora, il server restituisce 304 e il client riutilizza la cache. Impatto SEO: nessun effetto diretto sul ranking — Google ha già il contenuto, anche se Search può ancora ricalcolare i segnali di un URL — e un vantaggio di risparmio di risorse sui siti grandi (Google dice che può migliorare indirettamente l’efficienza del crawling; non promette la riallocazione automatica del crawl budget verso altri URL). L’infrastruttura di crawling di Google supporta entrambi i validator e raccomanda ETag come principale, perché non ha i problemi di formattazione delle date. Non confonderlo con 301/302/307/308, che spostano l’URL, né con 204, anch’esso senza body ma perché non c’è davvero nulla da inviare.

Che cosa significa 304 nella specifica

RFC 9110 (HTTP Semantics) §15.4.5 lo definisce con precisione: «Il codice di stato 304 (Not Modified) indica che è stata ricevuta una richiesta GET o HEAD condizionale che avrebbe prodotto una risposta 200 (OK), se la condizione non fosse risultata falsa». Questo è il trigger normativo effettivo: un GET/HEAD condizionale la cui condizione è falsa e che altrimenti avrebbe ricevuto 200. In termini semplici: il client chiede “dammi questa pagina, ma solo se è cambiata”, il server stabilisce che non è cambiata e salta l’invio del body. Una “seconda visita” è l’esempio quotidiano di come una richiesta diventa condizionale (il client allega un validator salvato da una risposta precedente), ma è un esempio didattico, non la regola: la specifica non richiede una visita precedente, soltanto una richiesta condizionale. Evidence for this claim RFC 9110 defines 304 Not Modified as the response to a conditional GET or HEAD when the selected representation has not changed and says the response cannot contain content. Scope: HTTP semantics for 304 conditional responses. Confidence: high · Verified: IETF: RFC 9110 §15.4.5 — 304 Not Modified

La specifica usa perfino la parola «redirecting» in questa sezione: il server reindirizza il client a usare quella rappresentazione salvata come se fosse il contenuto di una risposta 200 (OK). Ma leggila con attenzione: sta reindirizzando il client alla propria cache, non a un altro URL. Non c’è header Location e non c’è un nuovo indirizzo. Questa singola frase è all’origine della maggior parte della confusione sul fatto che 304 «sia un redirect». In senso HTTP non lo è.

Sono importanti anche altri due punti normativi:

  • Nessun body, mai. RFC 9110: “A 304 response is terminated by the end of the header section; it cannot contain content or trailers.” (traduzione) «Una risposta 304 termina alla fine della sezione degli header; non può contenere contenuto o trailer». Un 304 che invia un body viola la specifica e alcuni client lo gestiranno male. È una regola rigida, non una preferenza stilistica. La stessa specifica afferma: “The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false.” (traduzione) «Il codice di stato 304 (Not Modified) indica che è stata ricevuta una richiesta GET o HEAD condizionale che avrebbe prodotto una risposta 200 (OK), se la condizione non fosse risultata falsa.» Google aggiunge: “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” (traduzione) «Raccomandiamo vivamente di usare ETag perché è meno soggetto a errori e sbagli: il valore non è strutturato, a differenza di Last-Modified»; e: “Our recommendation is that you require a cache refresh on significant changes to your content; if you only updated the copyright date at the bottom of your page, that’s probably not significant.” (traduzione) «La nostra raccomandazione è richiedere un refresh della cache per cambiamenti significativi del contenuto; se hai aggiornato solo la data di copyright in fondo alla pagina, probabilmente non è significativo».
  • Trasporta gli stessi metadati che avrebbe un 200. Il server deve generare gli header che avrebbe inviato in una risposta 200 (OK) alla stessa richiesta — Content-Location, Date, ETag e Vary — oltre a Cache-Control ed Expires dove applicabile. Un 304 è quindi gli header del 200 senza il payload.
Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified

Come funziona davvero un 304: richieste condizionali

Un server non invia mai un 304 dal nulla. È sempre una risposta a una richiesta condizionale, resa tale dal client tramite un validator salvato da una risposta precedente. Esistono due validator.

ETag e If-None-Match

Un ETag (entity tag) è un token opaco che il server allega a una risposta 200: consideralo l’impronta della versione di quella precisa rappresentazione dell’URL. Alla richiesta successiva per quell’URL, il client rimanda il valore salvato nell’header If-None-Match. Il server confronta i valori: se l’ETag corrente corrisponde ancora, non è cambiato nulla e restituisce 304; se è diverso, restituisce un 200 fresco con il nuovo contenuto e un nuovo ETag.

Last-Modified e If-Modified-Since

L’alternativa basata sulla data: il server invia un timestamp Last-Modified nel 200. La volta successiva, il client lo rimanda nell’header If-Modified-Since e il server confronta le date: se la risorsa non è cambiata da quel timestamp, restituisce 304. È più semplice ma più grossolana (precisa solo quanto il timestamp) e sensibile alla formattazione esatta della data HTTP, una fonte comune di bug. Quando entrambi i validator sono presenti, If-None-Match (l’ETag) ha la precedenza su If-Modified-Since.

ETag forti e deboli

Un ETag può essere forte o debole e la differenza conta. Secondo le indicazioni MDN sulle richieste condizionali, la validazione forte garantisce che la risorsa sia identica byte per byte a quella con cui viene confrontata. Un ETag debole ha il prefisso W/ (per esempio ETag: W/"abc123") e afferma soltanto l’equivalenza semantica: l’esempio di MDN è che una pagina diversa da un’altra solo per una data diversa nel footer o per pubblicità diversa sarebbe considerata identica con la validazione debole. Gli ETag forti (senza prefisso) sono necessari per cose come le richieste di intervallo che richiedono una corrispondenza byte per byte; quelli deboli sono utili quando compressione, spazi bianchi o differenze banali non sostanziali non devono forzare un nuovo download completo. La trappola pratica: se l’ETag cambia ogni volta che il contenuto viene ricompresso con gzip/Brotli o varia tra server bilanciati, provocherai ricrawl inutili. Scegli deliberatamente forte o debole e mantieni stabile il valore per contenuti davvero invariati.

L’handshake completo, passo dopo passo

  1. Prima richiesta → il server restituisce 200 OK con il contenuto, più ETag e/o Last-Modified.
  2. Il client salva il contenuto e quei validator.
  3. Richiesta successiva → il client invia If-None-Match e/o If-Modified-Since con i valori salvati.
  4. Il server decide: invariato → 304 Not Modified, nessun body e il client riutilizza la cache; cambiato → 200 OK con il nuovo body e validator aggiornati. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation

Se vuoi approfondire cache e validator come leva per l’efficienza del crawling, cioè l’intera storia delle richieste condizionali e il collegamento con il crawl budget, questo è un argomento complementare; questo articolo si concentra sul codice di stato.

304 e SEO: nessun effetto sul ranking, un effetto reale sull’efficienza del crawl

Ecco l’intera storia SEO, più circoscritta di quanto facciano pensare molti testi boilerplate dei blog. 304 non ha alcun effetto diretto sul ranking e le indicazioni di Google su come i codici di stato influenzano crawling e indicizzazione delimitano anche l’effetto sull’indicizzazione: Search può ricalcolare i segnali di un URL, ma per il resto un 304 non cambia il modo in cui la pagina viene indicizzata. Google ha già il contenuto dal crawl precedente; un 304 conferma soltanto che non è cambiato e Google continua a usare ciò che possiede. Restituire 304 non dà alcun bonus di ranking.

Ciò che il 304 ti offre sono risparmi di risorse che possono migliorare indirettamente l’efficienza del crawl. Nel post di Google Search Central del dicembre 2024 sulla cache HTTP, Gary Illyes lo ha detto chiaramente: “Especially if you have a large site with rarely-changing content under individual URLs, allowing caching locally may help your site be crawled more efficiently. Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (traduzione) «Soprattutto se hai un sito grande con contenuti che cambiano raramente nei singoli URL, consentire la cache locale può aiutare il sito a essere sottoposto a crawl in modo più efficiente.»

Sul meccanismo esatto del 304, lo stesso post spiega chiaramente perché il body vuoto è il punto: “If the ETag value sent by the crawler matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body.” (traduzione) «Se il valore ETag inviato dal crawler corrisponde al valore corrente generato dal server, il server dovrebbe restituire una risposta HTTP 304 (Not Modified) senza body». Quel body assente conta perché il server non deve spendere risorse di calcolo per generare contenuto né trasferire il body HTTP. Risparmi calcolo e banda da entrambe le parti. La formulazione di Google per il beneficio a valle è condizionale: questi risparmi di risorse possono migliorare indirettamente l’efficienza del crawl. Non è una promessa che lo sforzo risparmiato venga automaticamente riallocato ai tuoi URL nuovi o aggiornati: trattalo come un meccanismo di risparmio delle risorse con un vantaggio a cascata plausibile, non garantito.

Perché conta di più sui siti grandi

Se hai qualche centinaio di pagine, il tema è in gran parte teorico: Google esplorerà comodamente l’intero sito. Il vantaggio cresce con le dimensioni: un sito con centinaia di migliaia o milioni di URL, molti dei quali cambiano raramente, trae un beneficio concreto quando i crawler possono evitare di riscaricare quelli invariati. È il pubblico a cui si rivolge il post di Google e questa è la cornice onesta da mantenere: non vendere il 304 come tattica per siti piccoli.

ETag o Last-Modified: che cosa conta come “cambiato”

Google raccomanda ETag come validator principale perché è meno soggetto a errori e sbagli: il valore non è strutturato, a differenza di Last-Modified. Impostare entrambi va bene ed è incoraggiato. Se usi Last-Modified, la data deve essere formattata secondo lo standard HTTP: Google raccomanda il formato “Weekday, DD Mon YYYY HH:MM:SS Timezone,” (traduzione) «Giorno della settimana, GG Mmm AAAA HH:MM:SS Fuso orario», per esempio “Fri, 4 Sep 1998 19:15:56 GMT” (traduzione) «Ven, 4 set 1998 19:15:56 GMT», altrimenti potrebbe essere ignorata in silenzio. Google suggerisce anche di impostare il campo max-age di Cache-Control per aiutare i crawler a decidere quando ripetere il crawl.

Evidence for this claim Google's crawler guidance recommends ETag because its opaque value avoids date-formatting errors, while also allowing both ETag and Last-Modified; this is Google-specific operational advice, not a change to HTTP validator semantics. Scope: HTTP cache validation Confidence: high · Verified: Crawling December: HTTP caching

Decidere quale cambiamento sia abbastanza importante da invalidare la cache spetta a te, ma il consiglio di Google è riservarlo ai cambiamenti sostanziali: richiedi un refresh della cache quando il contenuto cambia in modo significativo; se hai aggiornato soltanto la data di copyright in fondo alla pagina (traduzione) «la data di copyright in fondo alla pagina», probabilmente non è significativo.

Che cosa fanno davvero Googlebot e Bingbot

Non ogni richiesta del crawler è condizionale. La documentazione sui crawler di Google osserva che i singoli crawler e fetcher Google variano nel supporto alla cache in base al prodotto che servono: Googlebot supporta la cache durante il ricrawl degli URL per Search, mentre altri fetcher Google la supportano solo in determinate condizioni. Anche con header configurati correttamente, quindi, non aspettarti che il 100% delle richieste contenga If-None-Match/If-Modified-Since. Per Bing: le richieste condizionali non sono una funzione esclusiva di Google. Il crawler di Bing supporta richieste GET condizionali (inviando If-Modified-Since e, quando disponibile, If-None-Match, e accettando un 304 se il contenuto è invariato) almeno dal post del blog Live Search del 2008, anche se Bing non ha pubblicato un equivalente moderno dell’articolo di Google del 2024. Considera questi meccanismi comportamento HTTP generico applicabile a entrambi i motori.

Come implementare il supporto al 304

  1. Invia i validator nel 200. Configura server, CDN o app per allegare un ETag (raccomandato) e/o un header Last-Modified formattato correttamente alle risposte normali 200. Molti server e framework generano automaticamente gli ETag per i file statici; le risposte dinamiche di solito richiedono un’attivazione esplicita.
  2. Rispetta gli header condizionali al ritorno. Quando arriva una richiesta con If-None-Match/If-Modified-Since, confronta il validator corrente e restituisci 304 (senza body) se corrisponde ancora, oppure un 200 fresco se non corrisponde. Anche in questo caso i server di file statici spesso lo fanno per te; route applicative e edge worker spesso no, a meno che tu non li configuri.
  3. Decidi che cosa significa “cambiato” e mantieni stabile l’ETag per contenuti davvero invariati: non lasciare che ricompressione o differenze tra server lo facciano cambiare inutilmente.
  4. Controlla le configurazioni errate classiche:
    • Sempre-200: non emetti mai validator, quindi nessuna richiesta è condizionale e non ottieni il vantaggio di efficienza.
    • ETag instabili: un valore che cambia anche quando il contenuto non cambia (bilanciatori, ricompressione), costringendo a riscaricamenti continui.
    • 304 obsoleti: il caso pericoloso, un server che continua a restituire 304 (o un ETag invariato) dopo che il contenuto è davvero cambiato, così crawler e cache non ricevono mai l’aggiornamento. È un bug da individuare nell’analisi dei log, non un difetto intrinseco del 304.

304 rispetto agli altri codici di stato

304 rispetto a 301 / 302 / 307 / 308

Quelli sono i redirect veri. Un 301/308 (permanente) o 302/307 (temporaneo) porta un header Location e sposta il client verso un URL diverso; 301/308 trasferiscono anche un segnale di canonizzazione. Un 304 non ha Location, non sposta nessuno e non trasferisce segnali di ranking. Stessa famiglia 3xx per numerazione, lavoro completamente diverso. I dettagli dei singoli redirect sono negli articoli dedicati (vedi l’articolo sul redirect 301 e il sub-hub dei redirect).

304 rispetto a 204 No Content

Entrambi non hanno body, ma per ragioni completamente diverse. Un 204 No Content è un successo 2xx con body intenzionalmente vuoto perché il server non ha davvero nulla da inviare, per esempio una DELETE/PUT API completata o un beacon analitico. Un 304 non invia body non perché non ci sia nulla da inviare, ma perché “lo hai già e la copia è ancora valida”. Non confonderli: un 204 su un URL di pagina può essere trattato come un soft 404 perché non c’è contenuto indicizzabile, mentre un 304 conferma la validità di contenuto che Google possiede già. L’articolo 204 No Content tratta quel codice in dettaglio.

Miti comuni sul 304

  1. “304 è un redirect”. Nessun header Location, nessuno si sposta. Il client riutilizza la propria copia in cache. Il riferimento della RFC 9110 al reindirizzare il client verso la rappresentazione salvata significa riportarlo alla cache, non a un altro URL.
  2. “304 è un errore da correggere”. È il risultato corretto e previsto di una configurazione funzionante per le richieste condizionali. Vedere 304 in un crawl o nei DevTools indica che la cache funziona: è il fraintendimento più comune nella SERP.
  3. “304 aiuta il ranking”. Non esiste alcun effetto diretto sul ranking e Google delimita anche l’effetto sull’indicizzazione: Search può ricalcolare i segnali di un URL, ma per il resto un 304 non cambia l’indicizzazione. Il vantaggio è il risparmio di risorse che Google dice possa migliorare indirettamente l’efficienza del crawl sui siti molto grandi; non è un segnale di ranking né una garanzia che lo sforzo risparmiato passi ad altri URL.
  4. “If my server returns 304, Google will use stale content forever.” (traduzione) «Se il mio server restituisce 304, Google userà per sempre contenuto obsoleto». Il 304 scatta solo finché il validator corrisponde ancora. Nel momento in cui il contenuto cambia davvero, un server correttamente implementato restituisce un 200 fresco con nuovi validator. Il rischio reale è un server configurato male che continua a restituire 304 dopo il cambiamento: è un bug, non una proprietà del 304. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation
  5. “ETag e Last-Modified sono intercambiabili”. Entrambi sono validator, ma Last-Modified è sensibile al formato della data e preciso solo quanto il suo timestamp, mentre ETag è opaco e preciso (e può variare in modo problematico tra server o dopo una ricompressione se implementato senza attenzione). Google raccomanda ETag come principale; se puoi, imposta entrambi.

Domande frequenti

HTTP 304 è un errore? No: è un segnale di successo che indica che la cache funziona. Significa che la copia memorizzata dal client è ancora valida.

304 Not Modified è un redirect? No. Appartiene alla classe 3xx per numerazione, ma non ha un header Location e non sposta il client verso un nuovo URL.

Il 304 aiuta la SEO o il ranking? Nessun effetto diretto sul ranking e nessun effetto sull’indicizzazione oltre al possibile ricalcolo dei segnali di un URL da parte di Google. Risparmia banda e calcolo permettendo ai crawler di saltare le pagine invariate; Google dice che questo può migliorare indirettamente l’efficienza del crawl sui siti grandi.

Qual è la differenza tra ETag e Last-Modified? ETag è un’impronta opaca della versione, confrontata tramite If-None-Match; Last-Modified è un timestamp, confrontato tramite If-Modified-Since. Google raccomanda ETag perché è meno soggetto a errori.

Che cos’è un ETag forte rispetto a uno debole? Un ETag forte afferma che il contenuto è identico byte per byte; un ETag debole (con prefisso W/) afferma l’equivalenza semantica e tollera differenze banali, come la compressione o una data del footer cambiata.

Perché vedo 304 nei log o nei report di crawl? Perché i client inviano richieste condizionali e il server conferma correttamente che il contenuto non è cambiato. È previsto ed è positivo.

Come faccio a far restituire correttamente 304 al server? Invia ETag/Last-Modified nel 200, poi rispetta If-None-Match/If-Modified-Since nella richiesta successiva restituendo 304 senza body quando il validator corrisponde ancora.

Qual è la differenza tra 304 e 204? Entrambi non hanno body: il 204 perché non c’è nulla da inviare, il 304 perché possiedi già una copia ancora valida.

Googlebot invia header condizionali in ogni richiesta? No: il supporto alla cache varia in base al crawler, quindi non ogni richiesta sarà condizionale anche quando gli header sono configurati.

Una risposta 304 può avere un body? No. Secondo RFC 9110, “it cannot contain content or trailers” (traduzione) «non può contenere contenuto o trailer». Un 304 con body viola la specifica.

Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified

Try it live

This is a real endpoint on this site — not a simulation. Hit it from the button, open it in a new tab, or curl -i it from your terminal, and the server answers with the actual status code this article is about.

Open in new tab ↗

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.