TL;DR, Kurzantwort
8 Min. LesezeitDer bfcache (Back/Forward-Cache) behält einen vollständigen Snapshot einer Seite im Speicher, wenn der Besucher sie verlässt, sodass ein Klick auf Zurück oder Vorwärts sie sofort und ohne neues Laden wiederherstellt. Chrome, Firefox und Safari haben alle einen. Weil die Seite nicht erneut lädt, verpasst ein Analytics-Skript, das Pageviews nur beim Laden zählt, die Wiederherstellung. Hören Sie auf pageshow und prüfen Sie event.persisted, um Wiederherstellungen zu zählen, und vermeiden Sie unload-Listener, Cache-Control: no-store und offene Verbindungen, die eine Seite ausschließen.
Was ist der bfcache?
Der bfcache, kurz für Back/Forward-Cache, ist eine Browser-Optimierung, die einen vollständigen Snapshot einer Seite im Speicher behält, wenn der Besucher wegnavigiert, sodass ein Klick auf Zurück oder Vorwärts diese Seite sofort wiederherstellt, statt sie neu zu laden. web.dev definiert ihn als "a browser optimization that enables instant back and forward navigation," und beschreibt den Mechanismus: "instead of destroying a page when the user navigates away, we postpone destruction and pause JS execution. If the user navigates back soon, we make the page visible again and unpause JS execution."
Alle großen Browser haben einen: Chrome seit Version 96, Firefox und Safari. Klicks auf Zurück und Vorwärts machen einen großen Teil des Surfens aus. web.dev berichtet: "Chrome usage data shows that 1 in 10 navigations on desktop and 1 in 5 on mobile are either back or forward."
Für Analytics zählt, was bei einer Wiederherstellung nicht passiert. Es wird kein HTML angefordert, keine Skripte laufen von vorn, und kein load-Event feuert. Ihr Tracker wacht genau dort auf, wo er pausiert wurde.

Worin unterscheidet sich der bfcache vom HTTP-Cache?
Der bfcache speichert die ganze laufende Seite, der HTTP-Cache dagegen einzelne Antworten. web.dev formuliert es so: "bfcache is a snapshot of the entire page in memory, including the JavaScript heap, whereas the HTTP cache contains only the responses for previously made requests." Eine Seite aus dem HTTP-Cache lädt trotzdem: Der Browser parst das HTML, führt jedes Skript aus und feuert load, also sendet Ihr Tracker einen normalen Pageview. Eine aus dem bfcache wiederhergestellte Seite überspringt all das.
Auch Timer und Promises pausieren. web.dev schreibt, dass "browsers pause any pending timers or unresolved promises for pages in bfcache" und sie bei der Wiederherstellung fortsetzen. Ein Heartbeat- oder Engagement-Timer macht also nach der Lücke weiter, statt sie mitzuzählen.
Welche Seiten kommen für den bfcache infrage?
Eine Seite kommt für den bfcache infrage, solange nichts auf ihr das Caching unsicher macht, und die häufigsten Blocker haben Sie selbst in der Hand. Die Tabelle listet die, die web.dev und die Chrome-Dokumentation nennen.
| Blocker | Wirkung auf den bfcache | Lösung |
|---|---|---|
unload-Listener | Ausgeschlossen in Chrome und Firefox auf dem Desktop, in Firefox auch mobil außer auf iOS | Stattdessen pagehide nutzen |
Cache-Control: no-store auf der Seite | Hält die Seite bisher aus dem bfcache heraus | no-cache oder max-age=0 nutzen, sofern die Seite nicht sensibel ist |
Bedingungsloser beforeunload-Listener | Blockiert in modernen Browsern nicht mehr, früher aber schon, laut web.dev | Nur hinzufügen, solange ungespeicherte Änderungen bestehen |
Referenz auf window.opener | Eine Seite mit einem Opener ungleich null "can't safely be put into bfcache" | rel="noopener" nutzen |
| Offene IndexedDB-Verbindung | Manche Browser cachen die Seite nicht | Bei pagehide schließen, bei pageshow wieder öffnen |
Laufendes fetch() oder XMLHttpRequest | Manche Browser cachen die Seite nicht | Anfragen abschließen lassen oder bei pagehide abbrechen |
| Offene WebSocket- oder WebRTC-Verbindung | Blockiert in manchen Browsern; Chrome ab 149 und Safari blockieren bei offenen WebSockets nicht | Bei pagehide schließen |
Manche Fehlschläge haben mit Ihrem Code nichts zu tun. web.dev nennt Zurück- oder Vorwärts-Navigationen, die den bfcache nicht nutzen, "when the user quits the browser and starts it again," "when the user duplicates a tab," und "when the user closes a tab and reopens it," und merkt an, dass Browser gecachte Seiten nach einer gewissen Zeit verwerfen, um Speicher zu sparen. Eine Trefferquote von 100% ist kein realistisches Ziel.
Iframes folgen der Hauptseite. Ein Iframe wird nicht separat gecacht, und ein Iframe, das eine blockierende API nutzt, kann die ganze Seite aus dem bfcache heraushalten.
Wie melden pageshow und pagehide den bfcache?
Die Events pageshow und pagehide melden den bfcache über ihre Eigenschaft persisted. Bei pageshow ist persisted gleich true, wenn die Seite aus dem bfcache zurückkam, und false bei einem normalen Laden. Bei pagehide bedeutet persisted gleich true, dass der Browser die Seite cachen will, wobei web.dev betont, dass das "doesn't guarantee that a page will be cached."
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
console.log('This page was restored from the bfcache.');
} else {
console.log('This page was loaded normally.');
}
});pageshow "fires right after the load event when the page is initially loading and any time the page is restored from bfcache." Dieses Detail ist für Analytics wichtig, wie der nächste Abschnitt zeigt. Chromium-Browser feuern zusätzlich die Page-Lifecycle-Events freeze und resume, wenn eine Seite in den bfcache wechselt und ihn verlässt, aber web.dev weist darauf hin, dass Sie zum Messen Ihrer bfcache-Trefferquote pageshow brauchen.

Warum verpasst Analytics Zurück-Navigationen oder zählt sie doppelt?
Analytics verpasst Zurück-Navigationen, weil eine Wiederherstellung aus dem bfcache die Skripte der Seite nicht erneut ausführt, ein Tracker, der seinen Pageview beim Laden sendet, bleibt also stumm. web.dev schreibt Website-Betreibern, sie könnten "a decrease in the total number of pageviews reported as Chrome enables bfcache for more users" bemerken, und ergänzt, dass viele Websites "already underreporting pageviews from other browsers that implement bfcache, because many popular analytics libraries don't measure bfcache restores as new pageviews."
Doppelte Zählungen entstehen, wenn die gegenteilige Korrektur unsauber umgesetzt wird. Weil pageshow auch bei jedem normalen Laden feuert, sendet ein Listener, der bei jedem pageshow einen Pageview schickt, ohne persisted zu prüfen, zwei Pageviews pro Laden: einen vom normalen Start des Trackers und einen vom Listener.
Weitere Verzerrungen folgen aus demselben Mechanismus:
Flowsery
Jetzt 14 Tage kostenlos testen
Echtzeit-Dashboard
Zielverfolgung
Cookie-freies Tracking
- Lücken beim Engagement. Pausierte Timer laufen bei der Wiederherstellung weiter, also überspringen Engagement-Timer und Heartbeats die Zeit, in der die Seite im Speicher lag.
- Exit-Events, die nie gesendet werden. Eine Seite, die in den bfcache wechselt, feuert nie
unload. Der Leitfaden zu beforeunload vs. pagehide erklärt, warum Exit-Beacons stattdessen aufpagehideundvisibilitychangegehören. - Schnellere Seiten wirken langsamer. web.dev erklärt, dass Wiederherstellungen wiederholte Besuche ersetzen, die zu den schnellsten Ladevorgängen in einem Datensatz gehören. Die Ladezeitdaten verschieben sich also ins Langsamere, obwohl Besucher eine schnellere Erfahrung hatten.
- Gemischte Zählungen. Eine Zurück-Navigation, die den bfcache verfehlt, lädt komplett neu und wird gezählt, während eine, die ihn trifft, nicht gezählt wird. Dasselbe Klickmuster ergibt je nach Eignung unterschiedliche Zahlen.
Der Leitfaden zu Pageviews, Sessions und Nutzern zeigt, wie diese Lücken bis in die Kennzahlen pro Session durchschlagen.
- Der Tracker sendet den Pageview beim Laden
- Eine Wiederherstellung aus dem bfcache löst kein load-Event aus
- Der Zurück-Klick wird nie gezählt
- pageshow feuert auch bei jedem normalen Laden
- Jedes Laden sendet zwei Pageviews
- Wiederherstellungen zählen, aber Ladevorgänge doppelt
- Der Listener sendet nur, wenn event.persisted true ist
- Ein normales Laden bleibt bei einem Pageview
- Jede Wiederherstellung fügt genau einen hinzu
Wie zählen Sie Wiederherstellungen aus dem bfcache richtig?
Sie zählen Wiederherstellungen aus dem bfcache, indem Sie einen pageshow-Listener hinzufügen, der nur dann einen Pageview sendet, wenn event.persisted gleich true ist, und dann testen, dass jeder Klick auf Zurück genau einen Hit erzeugt.
- Den Listener hinzufügen. Das Google-Analytics-Beispiel von web.dev sendet
gtag('event', 'page_view')innerhalb vonif (event.persisted)und überlässt das normale Laden dem Standard-Pageview. - Den Navigationstyp markieren. Um die Trefferquote zu messen, deaktiviert web.dev den Standard-Pageview mit
send_page_view: false, sendet einen Pageview mitnavigation_typeausperformance.getEntriesByType('navigation')[0].typeund sendet bei Wiederherstellungennavigation_type: 'back_forward_cache'. Vergleichen Sie die Zahlen fürback_forwardundback_forward_cache. - Den DevTools-Test ausführen. Öffnen Sie in den Chrome DevTools Application, dann Back-forward Cache, und klicken Sie auf Run Test. Ein Erfolg lautet "Restored from back-forward cache". Ein Fehlschlag listet die Gründe auf und markiert behebbare als Actionable.
- Gründe aus echten Besuchen sammeln. Die Eigenschaft
notRestoredReasonsim Navigation-Timing-Eintrag meldet, warum eine Seite nicht wiederhergestellt wurde. Die Chrome-Dokumentation sagt, sie "has shipped from Chrome 123," mit Gründen wieunload-listenerundresponse-cache-control-no-store. - Die Blocker beheben. Ersetzen Sie
unloaddurchpagehide, entfernen Sieno-storevon Seiten, die nicht sensibel sind, und schließen Sie IndexedDB- oder WebSocket-Verbindungen beipagehide.
Performance-Kennzahlen brauchen dieselbe Sorgfalt. web.dev erklärt, dass Tools wie der Chrome User Experience Report Wiederherstellungen als eigene Seitenbesuche behandeln, und die Bibliothek web-vitals unterstützt Wiederherstellungen. Bei einer Wiederherstellung wird Largest Contentful Paint vom Zeitstempel des pageshow bis zum nächsten gezeichneten Frame gemessen, während Cumulative Layout Shift und INP auf 0 zurückgesetzt werden.
Wie wirkt sich der bfcache auf die Daten in Flowsery aus?
Die Dokumentation von Flowsery beschreibt nicht, wie der Tracker eine Wiederherstellung aus dem bfcache behandelt, testen Sie es also auf Ihrer eigenen Website, bevor Sie Code hinzufügen. Die Echtzeit-Analytics von Flowsery zeigen jeden Pageview in dem Moment auf Ihrem Dashboard, in dem er passiert, und damit ist die Prüfung schnell erledigt: Öffnen Sie eine Seite, klicken Sie auf einen Link, gehen Sie zurück und achten Sie darauf, ob die wiederhergestellte Seite als neuer Pageview erscheint. Führen Sie zuerst den bfcache-Test in den DevTools aus, damit Sie wissen, dass die Seite wiederhergestellt und nicht neu geladen wurde. Wenn Wiederherstellungen nicht erscheinen und Sie sie zählen wollen, stellt das npm-SDK von Flowsery eine Methode trackPageview() bereit, die Sie aus einem pageshow-Listener mit Prüfung von event.persisted aufrufen können. So vermeiden Sie die doppelte Zählung, die ein Listener ohne diese Prüfung verursachen würde.
Häufig gestellte Fragen
Haben alle Browser einen bfcache?
Ja, alle großen Browser haben einen. web.dev nennt Chrome seit Version 96, Firefox und Safari. Jeder Browser hat eigene Regeln für die Eignung, deshalb kann dieselbe Seite in einem Browser gecacht und in einem anderen neu geladen werden.
Feuert bei einer Wiederherstellung aus dem bfcache das load-Event?
Nein. Eine Wiederherstellung macht die pausierte Seite wieder sichtbar und setzt ihr JavaScript fort, also feuern load und DOMContentLoaded nicht. Das Event pageshow feuert, mit persisted gleich true.
Warum sind meine Pageviews gesunken, nachdem Chrome den bfcache ausgeweitet hat?
Mehr Klicks auf Zurück und Vorwärts wurden zu Wiederherstellungen statt zu Neuladevorgängen, und viele Analytics-Skripte zählen Pageviews nur beim Laden. web.dev beschreibt genau diesen Rückgang. Fügen Sie einen pageshow-Listener hinzu, der einen Pageview sendet, wenn event.persisted gleich true ist, falls Sie Wiederherstellungen zählen wollen.
Deaktiviert Cache-Control: no-store den bfcache?
Auf der Seite selbst hat es Seiten bisher aus dem bfcache herausgehalten. web.dev empfiehlt, es nur für Seiten mit sensiblen Informationen zu nutzen und für Seiten, die nur frische Inhalte brauchen, no-cache oder max-age=0 zu verwenden. Keine dieser beiden Optionen beeinflusst die Eignung.
Wie prüfe ich, ob eine Seite für den bfcache infrage kommt?
Gehen Sie in den Chrome DevTools zu Application, dann zu Back-forward Cache, und klicken Sie auf Run Test. Das Panel meldet, ob die Seite wiederhergestellt wurde, und listet andernfalls die blockierenden Gründe auf. Für echte Besuche lesen Sie notRestoredReasons aus dem Navigation-Timing-Eintrag.
Funktioniert der bfcache innerhalb einer Single-Page-App?
Nein. web.dev schreibt, dass der bfcache "doesn't work for 'soft navigations' within a single-page app." Er greift, wenn ein Besucher die App verlässt und mit dem Zurück-Button zurückkommt, wodurch die ganze App wiederhergestellt werden kann, statt neu zu starten, sofern die Seite dafür infrage kommt.
Was passiert mit Timern und Heartbeats, solange eine Seite im bfcache liegt?
Browser pausieren ausstehende Timer und unerfüllte Promises und setzen sie bei der Wiederherstellung fort. Ein Heartbeat oder Engagement-Timer macht nach der Lücke weiter, die Zeit im Speicher zählt also nicht als Engagement.
Hält ein unload-Listener eine Seite aus dem bfcache heraus?
Ja, in Chrome und Firefox auf dem Desktop sowie in Firefox mobil, außer unter iOS. Ersetzen Sie unload durch pagehide, dann bleibt die Seite geeignet.
Wie vermeide ich doppelte Pageviews mit einem pageshow-Listener?
pageshow feuert bei jedem normalen Laden und bei jeder Wiederherstellung. Senden Sie den Pageview daher nur, wenn event.persisted den Wert true hat. Den normalen Ladevorgang deckt der Start des Trackers bereits ab. Drücken Sie dann auf einer Testseite zurück und prüfen Sie, dass jeder Klick genau einen Treffer erzeugt.
Zählt Flowsery Wiederherstellungen aus dem bfcache automatisch?
Die Flowsery-Docs beschreiben das nicht, testen Sie es also auf Ihrer eigenen Seite. Öffnen Sie eine Seite, klicken Sie einen Link, drücken Sie zurück und beobachten Sie in der Echtzeit-Ansicht, ob ein neuer Pageview erscheint. Fehlt er, rufen Sie trackPageview() aus dem npm SDK in einem pageshow-Listener auf, der event.persisted prüft.
War dieser Artikel hilfreich?
Teilen Sie uns Ihre Meinung mit!
Sehen Sie uns öfter bei Google
Ein Klick macht Flowsery zu einer bevorzugten Quelle. Unsere Artikel stehen dann weiter oben in Ihren Top-Meldungen, im KI-Modus und in den KI-Übersichten.
Bevor Sie gehen...
Flowsery
Umsatzorientierte Analysen für Ihre Website
Verfolgen Sie jeden Besucher, jede Quelle und jede Conversion in Echtzeit. Einfach, leistungsstark und komplett ohne Cookies.
Echtzeit-Dashboard
Zielverfolgung
Cookie-freies Tracking
Verwandte Glossarbegriffe
Wie SPA-Tracking Pageviews zählt, wenn die Seite nie neu lädt
Genaues SPA-Tracking heißt: ein Pageview pro Screen mit dem richtigen Referrer. Wie History API, virtuelle Pageviews und GA4-History-Events zusammenspielen.


Warum Ihre GA4-Absprungrate nur die umgedrehte Engagement-Rate ist
Ihre GA4-Absprungrate ist der Anteil nicht engagierter Sitzungen. Wie Google sie definiert, was anders ist als in Universal Analytics und wo Sie sie ergänzen.


Was der GA4-Landing-Page-Bericht zählt und wo er leer bleibt
Googles GA4-Landing-Page-Bericht listet die erste Seite jeder Session. Wo er liegt, Standardkennzahlen, Zeilen mit (not set) und wie Sie die Quelle ergänzen.


Wie die GA4-Website-Suche erfasst, was Besucher eintippen
So richten Sie die GA4-Website-Suche über Enhanced Measurement ein, ergänzen eigene Parameter, finden die Dimension Search term und messen Suchen ohne URL.


So setzen Sie Nutzereigenschaften in GA4 und werten sie in Reports aus
So setzen Sie Nutzereigenschaften in GA4 per gtag oder Tag Manager, registrieren sie als nutzerbezogene Dimensionen und bleiben unter dem Limit von 25.


Wie Sie die Search Console mit GA4 verknüpfen und ihre Reports veröffentlichen
So lässt sich die Search Console mit GA4 verknüpfen: nötige Rollen, die zwei Reports in der Library veröffentlichen und was sich nicht verbinden lässt.
Verwandte Artikel


Was aus Chromes Abschaffung der Third-Party-Cookies wurde
Chromes Abschaffung der Third-Party-Cookies lief vom Plan 2020 bis zur Kehrtwende 2025. Jede Ankündigung von Google, was Chrome heute tut und die Folgen.


Warum CNAME-Cloaking Tracker nicht mehr vor Safari oder Brave versteckt
Tracker tarnten sich per CNAME-Cloaking als Ihre Subdomain. Wie der Trick wirkt, warum Safari Cookies auf 7 Tage kappt und wie Brave und uBlock ihn enttarnen.


Wie Cookie-Syncing Werbe-IDs über Websites hinweg abgleicht
Ad-Tech-Firmen tauschen per Cookie-Syncing Nutzer-IDs über Redirects und Pixel. Was Safari, Firefox und Chrome dagegen tun und warum Analytics es nie braucht.

