Caching per la SEO

Come il caching del browser e del server con Cache-Control, ETag e CDN migliora le prestazioni e i Core Web Vitals e quali problemi di caching influenzano il crawling.

Prima pubblicazione: 2 lug 2026 · Ultimo aggiornamento: 11 ago 2026 · Advanced
Lingue

Il caching conserva una copia di una pagina o di una risorsa — nel browser, sull’edge di una CDN o nella cache del crawler — così non deve essere rigenerata o riscaricata. Non è un fattore diretto di ranking, ma alimenta due elementi importanti: velocità delle pagine / Core Web Vitals (tramite TTFB e LCP) ed efficienza di crawling. Il crawler di Google rispetta solo ETag e Last-Modified (e usa max-age come indicazione per un nuovo crawling): preferisce ETag e, secondo la sua documentazione, le altre direttive di caching HTTP non sono supportate. Gli errori di caching più rischiosi non sono durate lente, ma configurazioni CDN errate e cache obsolete che bloccano o ingannano i bot.

TL;DR — Il caching opera su tre livelli importanti per la SEO: browser, edge della CDN e cache delle richieste condizionali del crawler. Non è un fattore di ranking, ma alimenta la velocità delle pagine (TTFB/LCP e, tramite bfcache, i Core Web Vitals delle navigazioni ripetute) e l’efficienza di crawling. Il crawler di Google preferisce ETag a Last-Modified, legge max-age solo come indicazione per il nuovo crawling e, secondo la sua documentazione, “other HTTP caching directives aren’t supported.” (traduzione) «le altre direttive di caching HTTP non sono supportate» (glossa italiana: le altre direttive di caching HTTP non sono supportate). Le CDN ottengono una velocità di crawling consentita più alta, ma solo quando la loro cache è calda; i rischi reali sono i lanci con cache fredda e le configurazioni errate di CDN/WAF che bloccano del tutto i bot.

Evidence for this claim Google's crawler documentation supports ETag/If-None-Match and Last-Modified/If-Modified-Since, prefers ETag when both are present, and says other HTTP caching directives are unsupported; Google's separate max-age advice is a recrawl-timing hint, not proof it follows browser cache semantics. Scope: Google crawling Confidence: high · Verified: Crawling December: HTTP caching Evidence for this claim HTTP caching uses Cache-Control and validators to control reuse and revalidation. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: HTTP caching Evidence for this claim Browser caches can reuse stored responses according to HTTP caching semantics. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: HTTP caching

I tre livelli del caching

Il caching per la SEO non è una sola cosa: sono tre meccanismi, ciascuno controllato in modo un po’ diverso:

  1. Cache del browser — il dispositivo del visitatore conserva i file, così le visualizzazioni ripetute saltano la rete. È ciò a cui PageSpeed Insights si riferisce con “Servi gli asset statici con una policy di caching efficiente.” (traduzione) «servi gli asset statici con una policy di caching efficiente»
  2. Cache CDN / edge — una rete di distribuzione dei contenuti conserva copie sui nodi edge in tutto il mondo (per la trattazione completa vedi l’approfondimento su CDN e SEO). La descrizione di Google dice che le CDN sono un intermediario tra origin e utente e che storicamente il loro obiettivo principale è il caching: conservano i contenuti di un URL, così il tuo server non deve servire di nuovo quel file per un certo periodo.
  3. Cache del crawler — Googlebot e Bingbot tengono un proprio registro dei cambiamenti dei contenuti usando richieste condizionali. È la leva del crawl budget; i dettagli appartengono all’approfondimento sulle richieste condizionali, quindi qui resterò a livello di sintesi.

La “cache del browser” sopra è una scorciatoia per più di un meccanismo. Secondo la guida al caching HTTP di MDN, vale la pena distinguere: la cache HTTP privata (per browser, indicizzata per richiesta e, nei browser moderni, partizionata per sito di primo livello per limitare il tracciamento cross-site), la cache in memoria usata dalla sessione corrente, la bfcache descritta sotto e, separatamente, la Cache Storage di un service worker, controllata dal JavaScript del sito e non governata direttamente dagli header Cache-Control. “Controlla la cache del browser” può quindi indicare quattro passaggi di debugging diversi, a seconda del meccanismo che si comporta male.

Perché il caching alimenta i Core Web Vitals

Recuperare risorse dalla rete è lento e costoso. Il caching elimina la latenza di rete e il costo di trasferimento per tutto ciò che non è cambiato. Questo si riflette direttamente in due misure vicine ai vitals: TTFB (una risposta dalla cache salta la rigenerazione sull’origin) e LCP (immagini, CSS e font in cache vengono renderizzati prima).

Cache-Control, nelle direttive che contano

Cache-Control è l’header principale. Queste sono le direttive da conoscere:

  • max-age=<seconds> — per quanto tempo una copia fresca resta valida. Per asset immutabili e versionati, la documentazione Lighthouse di Chrome raccomanda un anno o più un anno o più, per esempio Cache-Control: max-age=31536000.
  • no-cache — non significa “non memorizzare nella cache”. Significa “memorizzala, ma riconvalidala con il server prima di riutilizzarla”. Abilita comunque il flusso leggero 304.
  • no-store — è la direttiva che significa davvero non conservare alcuna copia in una cache HTTP. È una direttiva di caching, non un interruttore generale della privacy: secondo RFC 9111 non è un modo affidabile per cancellare la cronologia del browser e non dice nulla sulla Cache Storage del service worker.
  • public / private — indicano se le cache condivise (come una CDN) possono conservare la risposta oppure se può farlo solo il browser dell’utente finale.
  • immutable — salta la riconvalida finché la risposta è ancora fresca. Non significa “mai obsoleta”: quando scade max-age, si applicano di nuovo le normali regole di freschezza.
  • must-revalidate — vale all’estremo opposto della sequenza: conta solo dopo che una risposta è diventata obsoleta e dice alla cache di riconvalidarla con l’origin invece di servirla comunque.
  • s-maxage, stale-while-revalidate, stale-if-error — controlli più fini, soprattutto per CDN e cache condivise: durata separata per le cache condivise, riuso obsoleto limitato durante un fetch in background e riuso obsoleto limitato in caso di errore dell’origin. Il supporto varia tra browser e CDN, quindi controlla il supporto attuale prima di basarti su queste direttive; inoltre nessuna di queste direttive extra viene rispettata dal crawler di Google, come vedremo.

Cache-busting con nomi di file versionati

Il trucco che ti permette di memorizzare aggressivamente nella cache e aggiornare all’istante: inserisci un hash del contenuto nel nome del file, per esempio style.x234dff.css. Poiché l’URL è la chiave della cache, cambiando il file cambia l’URL; così le cache recuperano subito la nuova versione mentre le vecchie restano memorizzate per tutto il tempo desiderato. Sia la guida HTTP cache di web.dev sia l’articolo di ingegneria front-end di Bing descrivono lo stesso modello: Bing incorpora gli hash dei contenuti nell’URL, così “the URL acts as the cache key,” (traduzione) «l’URL funziona da chiave della cache», mantenendo coerenti le cache e consentendo scadenze lunghe.

La trappola della bfcache: dove no-store danneggia silenziosamente i CWV

Ecco un aspetto poco trattato. La cache indietro/avanti (bfcache) permette di ripristinare istantaneamente una pagina quando si preme “indietro”. Il ripristino dalla bfcache salta del tutto la misurazione di LCP/CLS/INP, quindi è un vantaggio puro per i dati sul campo di CrUX. Tuttavia, secondo la guida bfcache di Google, impostare Cache-Control: no-store sul documento della pagina ha storicamente fatto sì che i browser rifiutassero di memorizzare quella pagina nella bfcache. Se ti serve freschezza per un documento HTML ma non vuoi rinunciare all’idoneità alla cache indietro/avanti, usa no-cache o max-age=0 invece di no-store.

Come una cache decide che qualcosa è “abbastanza fresco”

Prima che intervenga un validator, una cache controlla la freschezza: l’età della risposta memorizzata ha superato la durata di freschezza assegnata da Cache-Control (o, in assenza di una durata esplicita, una durata euristica che la cache può stimare)? L’header di risposta Age indica da quanto tempo una cache condivisa conserva già la risposta: così puoi capire, in DevTools o dal log della CDN, quanta durata di freschezza rimane. Se è fresca, la cache può riutilizzarla immediatamente, senza alcuna richiesta. Se è obsoleta, dovrebbe convalidarla prima di riutilizzarla: è qui che ETag/If-None-Match e Last-Modified/If-Modified-Since diventano utili, come descritto dopo per la versione più ristretta di questo meccanismo HTTP usata da Googlebot.

Come Googlebot usa il caching (il lato dell’efficienza di crawling)

Google ha fatto una richiesta insolitamente diretta nel post di dicembre 2024 Crawling December: HTTP caching: abilita il caching così i suoi crawler possono evitare di riscaricare pagine invariate. Il dato più sorprendente di quel post è che i fetch memorizzabili nella cache sono in diminuzione: circa lo 0,026% del totale dei fetch era memorizzabile 10 anni fa, mentre oggi il numero è 0,017%. Sono numeri piccoli, ma Google vuole chiaramente che vadano nella direzione opposta.

ETag rispetto a Last-Modified: quale preferisce Google

L’infrastruttura di crawling di Google supporta i due validator standard: ETag (con If-None-Match) e Last-Modified (con If-Modified-Since). Google raccomanda con forza ETag perché il suo valore non è strutturato e quindi è meno esposto agli errori di parsing che può provocare una stringa di data; se sono presenti entrambi, i crawler usano il valore ETag come richiede lo standard HTTP. Google suggerisce comunque di impostarli entrambi, perché li usano altre applicazioni come i CMS. Se usi Last-Modified, la data deve seguire il formato HTTP, per esempio Fri, 4 Sep 1998 19:15:56 GMT, altrimenti non verrà analizzata.

Quando il validator memorizzato dal crawler corrisponde ancora, il server restituisce un 304 Not Modified senza corpo: è proprio questo il punto. Come dice Google, l’assenza del corpo fa sì che il server non consumi risorse per generare il contenuto e non consumi banda per trasferirlo. Il meccanismo 304 è il metodo di crawl budget trattato in dettaglio nell’articolo sulle richieste condizionali; qui basta sapere che esiste e fa risparmiare denaro a entrambe le parti.

La sfumatura che quasi tutti perdono

Il crawler di Google non agisce sull’intero insieme di direttive Cache-Control come farebbe un browser o una CDN. Secondo la panoramica ufficiale dei crawler, oltre a ETag/Last-Modified, “other HTTP caching directives aren’t supported.” (traduzione) «le altre direttive di caching HTTP non sono supportate» (glossa italiana: le altre direttive di caching HTTP non sono supportate). L’unica eccezione parziale: Google dice che puoi impostare facoltativamente max-age per aiutare i crawler a determinare quando ripetere il crawling di un URL, come indicazione per un nuovo crawling e non come blocco rigido. Quindi no-cache, s-maxage, stale-while-revalidate e simili modellano ancora il comportamento di browser e CDN, ma non cambiano il modo in cui Googlebot memorizza nella cache. Anche il consiglio di Google su quando invalidare è sensato: richiedi un refresh della cache in caso di cambiamenti significativi, mentre aggiornare solo la data del copyright nel footer non è significativo.

CDN e crawling

Una CDN offre più della velocità. L’infrastruttura di crawling di Google è progettata per consentire velocità di crawling più alte sui siti supportati da una CDN, dedotte dall’indirizzo IP che serve gli URL: presume che un origin supportato da CDN possa gestire più richieste simultanee.

Ma c’è una complicazione da pianificare: la cache fredda. Al primo accesso a un URL, la cache della CDN è “fredda”: nessuno lo ha ancora richiesto, quindi l’origin deve servirlo almeno una volta per riscaldare la cache. Google avverte che lanciare molti URL contemporaneamente grava quindi davvero sul crawl budget, con una velocità di crawling alta per alcuni giorni. Se fai un grande lancio o una migrazione del sito, pianifica che l’origin sopporti il carico completo per ogni URL prima che la CDN inizi ad aiutare.

Una configurazione errata della CDN è un rischio per il crawling

I problemi più gravi legati al caching non sono durate lente: sono configurazioni di CDN e WAF che bloccano i bot. Il post di Google sulle CDN è esplicito: per i blocchi temporanei, inviare 503/429 è il metodo preferito per segnalarli, mentre i timeout di rete vengono trattati come errori terminali e “hard”, che possono far rimuovere gli URL dall’indice. Il caso più subdolo è un blocco morbido: un interstitial di verifica del bot. Il crawler vede solo la pagina della sfida, non il sito; perciò Google raccomanda con forza di restituire 503 ai client automatici. Il modo più semplice per controllare che una CDN non stia bloccando silenziosamente Google è lo strumento Ispezione URL in Search Console: guarda l’immagine renderizzata; se mostra una sfida per il bot o una pagina vuota, parla con il provider CDN.

Sono favorevole a spostare i redirect sulla CDN. Nel podcast Marketing Speak l’ho descritto così: “One of my personal favorites that I don’t think it’s used enough, it’s actually just off loading your redirects to the CDN level.” (traduzione) «uno dei miei preferiti, che secondo me non viene usato abbastanza, è semplicemente spostare i redirect al livello CDN». (Vai alla citazione)

Errori di caching che danneggiano crawling e indicizzazione

Questo è l’aspetto che la maggior parte degli articoli sul “caching per la SEO” ignora. Una cache non rende soltanto le cose veloci: una cache sbagliata può servire a un bot i byte sbagliati e rompere crawling o indicizzazione.

Un caso reale: una cache condivisa che serve un robots.txt bloccante. Ho analizzato un caso di blocco intermittente di Googlebot ricondotto a una cache CDN condivisa tra un ambiente di test e il sito live. Come ho scritto in Indicizzato, anche se bloccato da robots.txt: “One possible cause would be a shared cache between a test environment and a live environment. When the cache from the test environment is active, the robots.txt file may include a blocking directive.” (traduzione) «una possibile causa è una cache condivisa tra un ambiente di test e uno live; quando è attiva la cache dell’ambiente di test, il file robots.txt può contenere una direttiva bloccante». La soluzione era separare la cache oppure escludere i file .txt dalla cache nell’ambiente di test. Una configurazione errata del caching ha causato direttamente un errore di crawling: è questa la categoria di rischio che fa davvero male.

Altri errori della stessa famiglia:

  • Cache CDN obsoleta che serve contenuti vecchi ai bot. Se la cache edge conserva una versione vecchia molto dopo la pubblicazione di una modifica, i bot continuano a vedere quella vecchia. Esegui il purge alla pubblicazione oppure lega la durata della cache alla frequenza con cui cambia davvero la pagina.
  • Frammentazione della cache per Vary / User-Agent. La chiave di una cache condivisa normalmente è solo l’URL; Vary aggiunge header di richiesta (come User-Agent o Accept-Language) a quella chiave, così le varianti vengono memorizzate separatamente. Se ometti un header che cambia davvero la risposta, un richiedente può ricevere la variante di un altro: confusione tra mobile/desktop o bot/umano. Se aggiungi troppi header a Vary, frammenti la cache in così tante chiavi quasi duplicate che il tasso di hit migliora appena. Separatamente, per motivi di privacy i browser moderni partizionano anche le proprie cache per sito di primo livello, quindi una risorsa memorizzata mentre è incorporata in un sito generalmente non viene riutilizzata quando è incorporata in un altro: è un meccanismo diverso da Vary, da non confondere quando fai debugging di un report “perché non è in cache?”.

La mia regola generale sulla durata nasce dal lavoro su LCP: come ho scritto nella mia guida Ahrefs al Largest Contentful Paint, “Your cache time should be as long as you are comfortable with” (traduzione) «la durata della cache dovrebbe essere lunga quanto ti senti a tuo agio» (glossa italiana: la durata della cache dovrebbe essere lunga quanto ti senti a tuo agio). E [“An ideal setup is to cache for a really long period of time but purge the cache when you make a change to a page.” (traduzione) «la configurazione ideale prevede una cache molto lunga e il purge quando modifichi una pagina»] (glossa italiana: la configurazione ideale è una cache molto lunga, con purge quando modifichi una pagina). Cache lunga, purge immediato. È questa combinazione a tenerti veloce e aggiornato.

Il caching è un fattore di ranking?

No, non direttamente. Non esiste un segnale di ranking legato alla presenza di ETag o a una buona policy Cache-Control. Il caching alimenta due elementi che contano per la visibilità: velocità delle pagine / Core Web Vitals (un input esplicito della page experience) ed efficienza di crawling (che determina la velocità con cui i contenuti nuovi e aggiornati vengono scoperti e aggiornati, influendo indirettamente sui risultati sensibili alla freschezza). Configuralo perché rende il sito veloce e facile da sottoporre a crawling, non aspettandoti un aumento diretto del ranking.

Add an expert note

Pin an expert quote

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