bfcache non è la cache HTTP
Data Pubblicazione: | | Performance

bfcache non è la cache HTTP

La cache HTTP tiene risposte. La bfcache tiene la pagina, JavaScript compreso. no-store sulla pagina, storicamente, la esclude. Il restore non rivalida. Non è l’INP.

La cache HTTP conserva risposte. La bfcache (back/forward cache) conserva la pagina intera in memoria, heap JavaScript compreso. Non è lo stesso cassetto e non è l’INP. Verifica del 12 ottobre 2026 su web.dev/articles/bfcache, pagina aggiornata il 2 luglio 2026 (Barry Pollard; prima pubblicazione 25 maggio 2023).

In breve: il tasto Indietro può riaprire uno snapshot, senza rifare le richieste. Cache-Control: no-store sulla pagina, storicamente, tiene fuori dalla bfcache. no-cache e max-age=0 no. L’evento unload è il modo più sicuro per restarne fuori, su desktop, in Chrome e Firefox. Un restore non è una navigazione HTTP e non rivalida.

Cosa trovi in questo articolo

  1. Due cache, non una

  2. Quali header la bloccano

  3. Unload, pageshow, SPA

  4. Errori da evitare

  5. In sintesi

Due cache, non una

La guida Back/forward cache, rilettura 12 ottobre 2026: «The "cache" used by bfcache is different from the HTTP cache». La bfcache è uno snapshot dell’intera pagina in memoria, heap JavaScript incluso. La cache HTTP contiene solo le risposte di richieste già fatte. Il pezzo canonico su quelle risposte resta cache HTTP. Il cluster è Performance.

Stessa pagina: è raro che tutte le richieste di un documento escano dalla sola cache HTTP, quindi un restore da bfcache è più rapido anche della ripetizione meglio ottimizzata senza bfcache. Non è una metrica di campo. L’INP misura altro: il pezzo INP non è FID non va letto come una scheda sulla bfcache.

Cache-Control: no-store dice al browser di non mettere la risposta in nessuna cache HTTP. Si usa per pagine con dati sensibili, per esempio dietro login. La bfcache non è una cache HTTP, ma — scrive web.dev — storicamente, se no-store sta sulla risorsa pagina (non su un sotto-risorsa), i browser hanno scelto di non conservarla in bfcache. C’è un lavoro in corso per cambiare questo comportamento in Chrome in modo che rispetti la privacy. Finché la pagina lo scrive così, no-store restringe l’idoneità e va tenuto solo dove nessun tipo di cache è accettabile.

Per contenuti che devono essere freschi ma non sono sensibili, la stessa guida indica Cache-Control: no-cache oppure max-age=0: il browser rivalida prima di servire dalla cache HTTP, e questi due non tolgono l’idoneità alla bfcache. Attenzione al restore: la pagina torna dalla memoria, non dalla cache HTTP. no-cache e max-age=0 non scattano e non c’è rivalidazione prima del disegno. La guida lo ritiene comunque un’esperienza migliore, perché il restore è immediato e la pagina non resta a lungo in bfcache.

Cache HTTPbfcache (web.dev, agg. 2 luglio 2026)
Cosa tieneRisposte di richieste già fatte.Snapshot della pagina, heap JavaScript incluso.
no-store sulla paginaNon conserva la risposta.Storicamente esclude anche la bfcache. Cambio in corso su Chrome.
no-cache / max-age=0Rivalida prima di riusare.Non tolgono l’idoneità. Al restore non c’è rivalidazione.
Indietro / avantiPuò evitare qualche richiesta, quasi mai tutte.Può ridisegnare lo snapshot senza ricaricare.

Unload, pageshow, SPA

web.dev, stessa rilettura: il modo più importante per ottimizzare la bfcache in tutti i browser è non usare mai l’evento unload. Su desktop, Chrome e Firefox rendono non idonea una pagina che aggiunge un listener unload. Safari tenta di mettere in cache alcune pagine che hanno quel listener, ma per limitare i guasti non esegue unload quando l’utente esce: l’evento diventa inaffidabile. Su mobile, Chrome e Safari tentano la cache anche con unload, perché su mobile quell’evento è da sempre inaffidabile. Firefox tratta le pagine con unload come non idonee, tranne su iOS, dove — dice la pagina — tutti i browser usano WebKit.

pageshow scatta dopo load al primo caricamento e ogni volta che la pagina è ripristinata. event.persisted === true significa restore da bfcache. pagehide scatta sia allo scaricamento sia quando il browser prova a mettere la pagina in bfcache: persisted === false vuol dire che non sta per entrarci; true vuol dire che il browser intende mettercela, non che ci riuscirà. freeze e resume esistono solo nei browser Chromium.

La bfcache segue le navigazioni gestite dal browser. Non copre le «soft navigation» dentro una single-page app. Può comunque servire quando si torna a una SPA, invece di reinizializzarla da zero. Un iframe non ha una bfcache propria: se la pagina principale viene ripristinata, gli iframe tornano com’erano all’ingresso in cache. Un iframe che usa API bloccanti può tenere fuori anche il frame principale.

Errori da evitare

  • Leggere un hit di cache HTTP come prova che l’Indietro ha usato la bfcache.

  • Mettere no-store su ogni documento «per essere freschi»: per la freschezza non sensibile la guida indica no-cache o max-age=0.

  • Aspettarsi una rivalidazione al restore: non avviene.

  • Agganciare unload «tanto su mobile non conta»: su desktop Chrome e Firefox quella pagina esce dalla bfcache.

  • Misurare l’INP e credere di avere misurato il tasto Indietro.

In sintesi

bfcache è memoria di pagina, non la cache HTTP e non l’INP. no-store sulla pagina, oggi, la restringe; unload la chiude su desktop in Chrome e Firefox. Il restore non rivalida. Si rilegge web.dev/articles/bfcache: l’aggiornamento in calce è del 2 luglio 2026. Verifica del 12 ottobre 2026.

Domande frequenti

No. web.dev/articles/bfcache, aggiornata il 2 luglio 2026, rilettura 12 ottobre 2026: la bfcache è uno snapshot in memoria, heap JavaScript incluso. La cache HTTP tiene solo risposte già richieste.
Sulla risorsa pagina, storicamente sì: i browser non la mettono in bfcache. C’è un lavoro in corso per cambiarlo in Chrome. no-cache e max-age=0 non tolgono l’idoneità, ma al restore non c’è rivalidazione.
Sì. Su desktop Chrome e Firefox escludono le pagine con un listener unload. Safari può cacherle ma non esegue unload all’uscita. Firefox su iOS segue WebKit, come gli altri browser su quel sistema.
pageshow con event.persisted true. pagehide con persisted true significa solo che il browser intende metterla in cache, non che ci riesce.
Le soft navigation interne no: la bfcache segue le navigazioni del browser. Può servire quando si torna a una SPA già visitata, senza reinizializzarla da zero.

Potrebbe interessarti anche...