Cache arrière/avant (bfcache)

Ce qu’est le cache arrière/avant (bfcache) : la fonction du navigateur qui gèle une page entière en mémoire pour une navigation Back/Forward instantanée, sa différence avec le cache HTTP, ce qui bloque son éligibilité, comment le tester et sa relation réelle, mais indirecte, avec Core Web Vitals et le SEO.

Première publication : 3 juil. 2026 · Dernière mise à jour : 9 août 2026 · Advanced
Langues

Le cache arrière/avant (bfcache) est une optimisation du navigateur qui gèle en mémoire une page entière — DOM, tas JavaScript et état d’exécution — lorsque vous la quittez, afin que Back ou Forward puisse la restaurer instantanément sans rechargement, nouveau rendu ni requête réseau, tant que le navigateur n’a pas évincé l’instantané. C’est une fonction du navigateur, pas un facteur de classement : les documents de classement Core Web Vitals de Google ne le mentionnent jamais. Sa pertinence SEO est indirecte et limitée : une navigation restaurée par bfcache produit un LCP presque instantané et pratiquement zéro CLS pour les utilisateurs concernés, ce qui peut améliorer les CWV de terrain sur les sites où les navigations Back/Forward sont nombreuses (1 sur 10 sur ordinateur et 1 sur 5 sur mobile), sans garantir le taux de restauration, la note CWV globale, le classement ou la conversion. Le principal bloqueur est l’événement unload ; historiquement, c’était Cache-Control: no-store, même si Chrome autorise désormais conditionnellement de nombreuses pages no-store depuis son déploiement de 2025. Testez avec Chrome DevTools ou, pour les données de terrain, l’API notRestoredReasons propre à Chrome. Ne le confondez pas avec le cache HTTP, le cache de ressources en mémoire, le Cache Storage d’un service worker ou l’ancienne fonction de recherche de page en cache, désormais retirée.

TL;DR — Le bfcache est un instantané de page entière en mémoire (DOM + tas JS + état d’exécution), et non une réponse HTTP récupérable, le cache de ressources en mémoire du navigateur ou le Cache Storage d’un service worker — c’est la distinction conceptuelle n° 1 à retenir. Lorsque vous quittez une page, le navigateur met JavaScript en pause et gèle la page ; avec Back/Forward, si l’instantané gelé est encore disponible, il le dégèle et le réaffiche instantanément, sans aucune requête réseau — mais l’éviction reste possible : considérez donc une restauration comme probable, pas garantie. Ce n’est pas un facteur de classement documenté par Google Search (les documents Core Web Vitals de Search Central ne le mentionnent jamais) ; sa pertinence est indirecte et limitée, via la mesure CWV de terrain (surtout LCP et CLS) pour les navigations effectivement restaurées. Elle ne garantit ni votre taux de restauration, ni votre note CWV globale, ni le classement ou la conversion. Le principal bloqueur d’éligibilité est le gestionnaire unload (environ 18 points de pourcentage du taux de restauration dans Chrome) ; historiquement, le plus important était Cache-Control: no-store (bloquant environ 17 % des navigations historiques mobiles et 7 % des navigations desktop), même si Chrome autorise désormais conditionnellement le bfcache pour de nombreuses pages no-store (éviction si l’authentification ou les cookies changent, et blocage persistant par les mêmes API de connexions ouvertes) depuis son déploiement de 2025. Les connexions ouvertes, minuteries et observateurs doivent être fermés ou mis en pause dans pagehide/freeze, puis recréés dans pageshow/resume ; window.opener, les politiques de permissions et les cadres peuvent aussi le bloquer — consultez la raison par cadre dans DevTools ou notRestoredReasons au lieu de supposer. Testez ponctuellement avec Chrome DevTools ; diagnostiquez sur le terrain avec l’API notRestoredReasons, propre à Chrome (un résultat null ne prouve pas une restauration et le texte des raisons n’est pas stable). Chaque navigateur a ses propres règles d’éligibilité et les navigations douces des SPA ne bénéficient pas du même traitement.

Evidence for this claim The back-forward cache stores a complete page snapshot for instant history navigation. Scope: Current official or standards documentation. Confidence: high · Verified: web.dev: Back/forward cache Evidence for this claim Browser eligibility rules and APIs such as unload handlers can prevent bfcache use. Scope: Current official or standards documentation. Confidence: high · Verified: web.dev: bfcache eligibility

Ce qu’est réellement le bfcache (le socle de précision)

Le point le plus important : le bfcache est un instantané de page entière en mémoire, et non une réponse HTTP mise en cache. Lorsque vous quittez une page, le navigateur met en pause l’exécution de JavaScript et gèle toute la page — le DOM, le tas JS, les minuteries en cours, tout — puis la conserve en mémoire. Si vous appuyez sur Back ou Forward alors que l’instantané est encore disponible, il le dégèle et réaffiche exactement la page quittée, avec zéro requête réseau et zéro nouveau rendu. C’est une restauration possible, pas une garantie : l’instantané peut être évincé avant votre retour (pression mémoire, délai, événement particulier), ou une règle propre au navigateur peut imposer un chargement complet. La formulation canonique de Google est que le bfcache est “a browser optimization that enables instant back and forward navigation.” (traduction) : « une optimisation du navigateur qui permet une navigation arrière et avant instantanée. »

C’est pourquoi le confondre avec le cache HTTP ou du navigateur est l’erreur récurrente des contenus concurrents. Le cache HTTP stocke des réponses aux requêtes précédentes et peut les resservir. Le bfcache stocke la page vivante en cours d’exécution. La documentation de Chrome DevTools fait explicitement la distinction : le bfcache “differs from browser cache and HTTP cache.” (traduction) : « diffère du cache du navigateur et du cache HTTP. » Vous n’activez pas le bfcache avec des en-têtes de cache comme vous configurez le cache HTTP ; les en-têtes n’interviennent ici que parce que Cache-Control: no-store disqualifiait autrefois une page (voir plus bas).

La même distinction vaut pour deux autres caches que l’on confond parfois avec le bfcache : le cache de ressources en mémoire du navigateur (scripts compilés et images décodées conservés pendant la session) et le Cache Storage d’un service worker (paires requête/ réponse explicites qu’un site gère lui-même avec caches.open()). Les deux peuvent être actifs sur la même page en même temps que le bfcache ; aucun n’est le bfcache, qui désigne précisément l’instance de page gelée, et non des ressources en cache ou des réponses interceptées.

Une autre distinction est utile, car la confusion persiste : le bfcache n’a rien à voir avec l’ancienne fonction de recherche « page en cache » que Google (et Bing) proposait autrefois dans ses résultats. Il s’agissait de l’instantané d’une page conservé dans l’index du moteur, et cette fonction a été retirée. Le bfcache est une fonction du moteur de rendu côté client.

Les navigations Back/Forward sont-elles vraiment fréquentes ?

Ce n’est pas un cas marginal. D’après web.dev : “1 in 10 navigations on desktop and 1 in 5 on mobile are either back or forward.” (traduction) : « une navigation sur dix sur ordinateur et une sur cinq sur mobile est une navigation arrière ou avant ». Sur tout site où les utilisateurs reviennent en arrière (du catalogue au produit puis retour, résultats de recherche, contenu paginé ou lecture d’article en article), cela représente une grande part des navigations réelles que vous pouvez rendre presque instantanées.

Compatibilité des navigateurs

“All major browsers include a bfcache, including Chrome since version 96, Firefox and Safari.” (traduction) : « Tous les navigateurs majeurs incluent un bfcache, notamment Chrome depuis la version 96, Firefox et Safari. » Firefox et Safari disposent de leurs propres implémentations anciennes du bfcache ; tous les navigateurs fondés sur Chromium (Edge, Brave, Opera, Arc) héritent de Chrome. La documentation des politiques Microsoft Edge décrit la même fonction : lorsqu’une page est quittée, son état actuel (arbre du document, script, etc.) peut être conservé dans le cache arrière/avant ; si le navigateur revient à la page, celle-ci peut être restaurée et affichée dans l’état où elle se trouvait avant la mise en cache. La fonction est activée par défaut dans Edge ; le seul interrupteur est une règle d’entreprise contrôlée par l’administrateur informatique, pas par le propriétaire du site.

La réserve importante est la suivante : chaque navigateur applique ses propres règles d’éligibilité au bfcache. Une page qui passe le test « Test back/forward cache » de Chrome DevTools n’est pas garantie d’être éligible dans Firefox ou Safari. Considérez un résultat positif dans Chrome comme nécessaire, mais pas suffisant.

Ce qui bloque l’éligibilité au bfcache

L’événement unload — le principal bloqueur

Si vous ne retenez qu’une chose de cet article : cessez d’utiliser l’événement unload. web.dev insiste rarement autant dans un document Google : “Never use the unload event. Ever!” (traduction) : « N’utilisez jamais l’événement unload. Jamais ! » Dans Chrome, les gestionnaires unload entraînent environ 18 points de pourcentage de baisse du taux de restauration du bfcache, de loin la plus grande disqualification que vous puissiez vous infliger.

Chrome le déprécie activement pour deux raisons. Premièrement, c’est le plus grand bloqueur du bfcache. Deuxièmement, unload est extrêmement peu fiable : sur mobile, il ne se déclenche souvent pas du tout, car les onglets passent en arrière-plan puis sont supprimés et le navigateur privilégie le bfcache plutôt que le déclenchement de unload. L’événement sur lequel vous comptez pour le « nettoyage » ne se produit donc souvent pas et bloque un véritable gain de performance.

Les corrections :

  • Remplacez unload par pagehide. L’événement pagehide se déclenche dans tous les cas où unload se déclenche, ainsi que lorsqu’une page entre dans le bfcache : c’est donc une amélioration stricte. Utilisez visibilitychange pour un nettoyage fiable lorsque « l’utilisateur quitte la page ».
  • Détectez une restauration du bfcache avec pageshow. Écoutez pageshow et vérifiez event.persisted — si sa valeur est true, la page a été restaurée depuis le bfcache : c’est le signal pour actualiser les données obsolètes ou recompter une page vue.
  • Bloquez préventivement les écouteurs unload avec l’en-tête de réponse Permissions-Policy: unload=(), qui empêche tout gestionnaire unload d’être enregistré. Chrome migre progressivement la politique par défaut vers le refus (une Permissions-Policy pour unload a été livrée avec Chrome 115).

Cache-Control: no-store — historiquement le plus important, aujourd’hui nuancé

C’est le point de fraîcheur que la plupart des contenus concurrents présentent mal. Historiquement, Cache-Control: no-store était la principale raison d’exclure les pages du bfcache — les propres chiffres de Chrome l’estiment à environ 17 % des navigations historiques sur mobile et 7 % sur ordinateur. De nombreux sites définissent no-store par prudence pour éviter de servir une page obsolète, mais Google explique que cet argument perd de sa force avec le bfcache : une restauration ne charge pas une réponse en cache obsolète ; elle réaffiche la page vivante exacte, presque comme si l’onglet était resté ouvert.

Chrome a donc modifié son comportement — mais sous conditions, pas universellement. Les expériences ont commencé dans Chrome 116, avec un déploiement final auprès de 100 % des utilisateurs en mars et avril 2025 : Chrome autorise désormais le bfcache pour de nombreuses pages no-store, sous réserve de conditions de sécurité précises plutôt que d’une exception générale. D’après la documentation de Chrome, la page est évincée du bfcache si l’état d’authentification ou les cookies changent pendant qu’elle est gelée (ainsi un visiteur déconnecté ou dont les cookies ont été effacés ne voit pas un instantané d’une session ouverte), et une liste fixe d’API — les API de connexion ouverte détaillées ci-dessous (IndexedDB, WebSocket, WebRTC, entre autres) — exclut encore une page no-store du bfcache comme n’importe quelle autre page. Ce comportement est propre à Chrome et à une plage de versions donnée ; ne supposez pas que d’autres navigateurs ou d’anciennes versions de Chrome le suivent. Consultez le rapport DevTools/notRestoredReasons actuel pour le navigateur et la version testés au lieu de faire confiance à une règle fixe. À retenir : tout guide (y compris les anciennes versions de celui-ci) qui présente no-store comme un bloqueur inconditionnel et permanent du bfcache est obsolète — tout comme l’affirmation selon laquelle le problème serait entièrement résolu. Si la fraîcheur compte réellement, la documentation de Chrome suggère no-cache ou un max-age court (par exemple max-age=60), plutôt que no-store.

Connexions ouvertes, observateurs et autres bloqueurs

Au moment de la navigation, certaines ressources ouvertes peuvent encore bloquer l’éligibilité — lesquelles, et le fait qu’elles bloquent totalement ou puissent être fermées puis reconnectées, dépendent du navigateur et de sa version. Considérez la liste ci-dessous comme des exemples de comportement, pas comme une liste fixe et permanente :

  • Requêtes fetch()/XMLHttpRequest en cours.
  • Transactions IndexedDB ouvertes.
  • Connexions WebSocket/WebRTC, minuteries et observateurs ouverts (MutationObserver, IntersectionObserver et autres). Cette zone évolue activement : les notes de version récentes de Microsoft Edge montrent qu’une connexion WebSocket ouverte est désormais fermée lorsqu’une page entre dans le bfcache (au lieu de bloquer entièrement la mise en cache), et recommandent de la reconnecter via l’événement pageshow et la vérification event.persisted. Cela suit la tendance de Chrome à réduire les bloqueurs plutôt qu’à exclure systématiquement les pages.

Le modèle général à adopter, plutôt que de mémoriser une liste fixe, est le suivant : fermez ou mettez en pause les connexions, minuteries et observateurs ouverts dans votre gestion de pagehide/freeze, puis rétablissez-les dans la gestion de pageshow/resume lorsque event.persisted vaut true. Ce modèle résiste à l’évolution des navigateurs : certaines API peuvent bloquer l’éligibilité tandis que d’autres sont désormais simplement suspendues et peuvent être reconnectées.

window.opener, les politiques de permissions et les cadres. Une référence window.opener, certaines politiques de permissions et des iFrames intégrées (de même origine ou d’origine différente) peuvent aussi affecter l’éligibilité — c’est indiqué dans la checklist que j’ai synthétisée dans le guide CLS d’Ahrefs et dans la documentation de Chrome. Ne déduisez pas la cause réelle d’une checklist générique : le panneau DevTools de Chrome et l’API notRestoredReasons signalent les raisons de blocage par cadre — le cadre supérieur et chaque iFrame séparément — car le cadre responsable n’est pas toujours la page de premier niveau. Récupérez la raison réelle dans le rapport par cadre du navigateur testé au lieu de deviner à partir d’une liste générale.

Bien gérer la séquence des événements et de l’état du cycle de vie

Confondre ce que chaque événement du cycle de vie prouve réellement avec ce qu’il suggère seulement est, après les erreurs d’éligibilité ci-dessus, le deuxième bug de justesse le plus courant ici :

Événement / étatSignalCe que cela signifie réellementQue faire
pagehide (event.persisted === true)Intention de mise en cacheLe navigateur tente de geler la page pour le bfcache — l’entrée en cache n’est pas confirméeFermer ou mettre en pause connexions, minuteries et observateurs ; ne pas supposer que la page sera restaurée
freezeEn pauseL’exécution JS est suspendue ; la page peut encore être évincée avant toute restaurationAucune action supplémentaire après le nettoyage déjà effectué dans pagehide
(aucun événement) éviction possibleLe navigateur peut supprimer une page gelée de la mémoire à tout moment — pression mémoire, délai ou règle du navigateur — et aucun événement ne se déclenche pour celaNe comptez pas sur un nettoyage ultérieur ; faites-le inconditionnellement dans pagehide/freeze
pageshow (event.persisted === true)Restauration confirméeLe seul signal fiable qu’une restauration bfcache a réellement eu lieuActualiser l’état sensible au temps, reconnecter les connexions fermées, compter exactement une vue analytique
resumeRepriseL’exécution JS reprend après une restauration confirméeReconnecter ce qui a été mis en pause dans freeze

La règle pratique : traitez pagehide.persisted comme une intention, pas comme une preuve — la page peut encore être évincée avant que vous ne voyiez une restauration. Seul pageshow.persisted === true prouve qu’une restauration a eu lieu. Effectuez toujours le nettoyage dans pagehide/freeze (c’est peu coûteux et sûr même lors d’une navigation ordinaire), et ne faites le travail propre à la restauration que dans pageshow/resume, conditionné par event.persisted, afin de ne pas actualiser les données ou compter deux fois une vue analytique lors d’un chargement normal.

Comment tester et diagnostiquer le bfcache

En laboratoire / ponctuellement : Chrome DevTools

Ouvrez DevTools → Application → Background services → Back/forward cache, puis cliquez sur “Test back/forward cache.” Chrome navigue automatiquement vers chrome://terms/ puis revient en arrière et signale soit la réussite, soit la liste précise des raisons de blocage. C’est idéal pour vérifier une URL à la fois.

Sur le terrain / en production : l’API notRestoredReasons

Auparavant, la seule manière de vérifier l’éligibilité était ce test DevTools manuel, URL par URL : il était impossible de voir pourquoi les navigations des vrais utilisateurs étaient bloquées. La propriété notRestoredReasons de PerformanceNavigationTiming (disponible depuis Chrome 123+) comble cette lacune : elle indique à grande échelle les raisons précises de blocage du cadre supérieur et des iFrames de même origine dans les données de terrain.

const nav = performance.getEntriesByType('navigation')[0];
console.log(nav.notRestoredReasons);

Voici quelques points à respecter, directement issus des recommandations de l’API Chrome :

  • Chrome uniquement (123+). Firefox et Safari n’exposent pas d’API de terrain équivalente : vous devez donc toujours effectuer des vérifications manuelles dans ces navigateurs pour connaître votre taux de restauration.
  • Un résultat null est ambigu, pas un feu vert. Il peut signifier que la page a été restaurée, ou que le navigateur n’a simplement pas collecté de raison — la documentation de Chrome recommande de ne pas traiter null comme la preuve d’une restauration réussie.
  • Le texte d’une raison n’est pas un contrat stable. Ne faites pas de correspondance codée en dur sur les chaînes ; regroupez les raisons et suivez leur évolution, car leur formulation peut changer selon les versions de Chrome.

En pratique, relevez notRestoredReasons avec les taux de restauration pageshow.persisted avant et après la mise en production d’un correctif, comparez la tendance plutôt qu’un instantané et complétez par un passage manuel dans DevTools/lab sur Firefox et Safari, que l’API ne peut pas couvrir. C’est l’outil à utiliser pour diagnostiquer le bfcache à grande échelle dans le RUM/la production, plutôt que de vérifier les URL une par une — mais ne le considérez pas comme toute l’histoire.

Bfcache et Core Web Vitals — la relation précise

Voici la nuance que la plupart des contenus concurrents brouillent, et l’angle qu’il vaut la peine d’assumer.

Mesure d’une restauration bfcache. Les navigateurs (et donc les données de terrain CrUX) comptent une navigation restaurée par bfcache comme un « chargement de page » extrêmement rapide — LCP presque instantané et, lorsque la page est correctement implémentée (aucun nouveau calcul de mise en page), zéro CLS supplémentaire en pratique, car il n’y a pas de nouveau rendu. Dans la comparaison réelle de DebugBear, une page restaurée par bfcache a atteint environ 100 ms de LCP contre ~427 ms pour un chargement non mis en cache. C’est précisément pourquoi le bfcache apparaît comme levier pour CLS et LCP dans ma checklist CLS d’Ahrefs, où je le formule ainsi : “Make sure your pages are eligible for bfcache. The back/forward cache keeps pages in the browser cache. It allows for instant loading of a page that was already loaded, meaning no layout shifts will happen.” (traduction) : « Vérifiez que vos pages sont éligibles au bfcache. Le cache arrière/avant conserve les pages dans le cache du navigateur et permet de charger instantanément une page déjà chargée ; aucun décalage de mise en page ne se produira. »

Deux réserves de périmètre méritent d’être précisées, car c’est ici que les contenus concurrents exagèrent le plus. Premièrement, cela ne concerne que les navigations que CrUX classe comme arrière/avant (sa dimension navigation-type) : cela ne dit rien de votre première visite ni de vos rechargements, qui constituent la majorité du trafic de la plupart des sites. Deuxièmement, une amélioration de l’expérience mesurée pour les utilisateurs qui bénéficient d’une restauration ne constitue pas une garantie : un utilisateur dont la page a été évincée du bfcache (voir le tableau du cycle de vie) obtient toujours un chargement normal, sans amélioration. Le travail d’éligibilité déplace votre taux de restauration parmi les navigations Back/Forward ; il ne garantit ni une part fixe du trafic total, ni votre note Core Web Vitals de terrain globale, ni votre classement, ni votre taux de conversion. C’est un levier réel et mesurable, au périmètre précis et limité, pas une correction générale de performance ou de SEO.

Le bfcache est-il un facteur de classement ? Non. C’est l’affirmation défendable et différenciante. La documentation de Google sur le classement Core Web Vitals ne mentionne pas du tout le bfcache. La chaîne d’influence honnête est : éligibilité au bfcache → meilleurs chiffres CWV de terrain (surtout LCP/CLS) sur les navigations arrière/ avant → Core Web Vitals est l’un des signaux « expérience de page » parmi ceux que Google dit alignés sur les éléments déjà valorisés par ses systèmes de classement. C’est une affirmation beaucoup plus faible et précise que « le bfcache améliore le classement » — et c’est celle que les contenus concurrents devraient formuler avec plus de soin. Le bfcache est aussi, correctement, une fonction du moteur de rendu, pas du robot : il n’a rien à voir avec l’exploration de vos pages par Googlebot ou Bingbot ; il n’existe donc pas de « point de vue de Bing sur le bfcache pour le SEO » comparable aux informations sur robots.txt ou les sitemaps.

SPA et navigations douces. Le bfcache fonctionne avec les véritables navigations et événements d’historique du navigateur. Le changement d’itinéraire « doux » côté client d’une application monopage (un échange de vue piloté par JS qui ne déclenche pas une vraie navigation du navigateur) n’est pas un événement bfcache et ne reçoit pas le même traitement. Les tentatives de certains outils RUM pour attribuer les Core Web Vitals aux navigations douces peuvent créer des écarts de mesure entre CrUX et RUM — un point à signaler lors de l’audit d’un site construit avec un framework JS.

Quelle est la fréquence des bloqueurs bfcache dans le monde réel ?

Le Web Almanac de HTTP Archive suit ce sujet, qui évolue encore : ce ne sont pas de vieilles nouvelles définitives. Dans l’édition 2022, au moins ~22 % des pages mobiles étaient inéligibles au bfcache selon les seuls critères unload et no-store. Depuis, l’utilisation des gestionnaires unload diminue dans les différentes catégories de sites et d’appareils ; en revanche, celle de Cache-Control: no-store a augmenté (le chapitre 2025 l’estime à environ 23 % des sites, contre ~21 % en 2024, en partie à cause des expériences authentifiées/ personnalisées plus nombreuses et d’exigences de conformité plus strictes).

Le constat contre-intuitif mérite d’être cité : les sites plus grands et à fort trafic bloquent proportionnellement davantage leur propre bfcache. Parmi les 1 000 premiers sites, environ 28 % des pages desktop et 20 % des pages mobiles utilisent encore des gestionnaires unload, contre seulement ~11 % sur desktop et ~10 % sur mobile pour tous les sites — souvent parce que les grands sites portent davantage de code analytique ancien et dépendant de unload. Les sites qui ont le plus de trafic Back/Forward à perdre sont souvent ceux qui se mettent encore eux-mêmes en difficulté.

Où cela s’insère

Le bfcache est l’un des leviers de performance de ce cluster. Son bénéfice apparaît dans les données de terrain Core Web Vitals, plus précisément dans Cumulative Layout Shift et Largest Contentful Paint, puisqu’une page restaurée se réaffiche instantanément sans nouveau calcul de mise en page. Il se distingue du cache, qui stocke des fichiers plutôt qu’un instantané de page vivante, même si les deux utilisent l’en-tête Cache-Control. Il n’existe pas de lien direct avec Interaction to Next Paint, et je ne vais pas en forcer un.

Add an expert note

Pin an expert quote

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