Gérer le comportement du cache

Firebase Hosting utilise un CDN mondial performant pour accélérer votre site autant que possible.

Tout contenu statique demandé est automatiquement mis en cache sur le CDN. Si vous redéployez le contenu de votre site, Firebase Hosting efface automatiquement tout le contenu mis en cache sur le CDN jusqu'à la requête suivante.

Toutefois, comme les services Cloud Functions et Cloud Run génèrent du contenu de manière dynamique, le contenu d'une URL donnée peut varier en fonction de facteurs tels que les entrées utilisateur ou l'identité de l'utilisateur. Pour tenir compte de cela, les requêtes gérées par le code du backend ne sont pas mises en cache sur le CDN par défaut.

Vous pouvez toutefois configurer le comportement de mise en cache du contenu dynamique. Par exemple, si une fonction ne génère de nouveau contenu que périodiquement, vous pouvez accélérer votre application en mettant en cache le contenu généré pendant au moins une courte période.

Vous pouvez également configurer le comportement de mise en cache pour réduire potentiellement les coûts d'exécution des fonctions, car le contenu est diffusé à partir du CDN plutôt que d'une fonction déclenchée. Pour en savoir plus sur l'optimisation de l'exécution des fonctions et des services, consultez la documentation Cloud Functions et Cloud Run.

L'exception concerne les requêtes qui renvoient des erreurs 404. Le CDN met en cache la réponse 404 de votre service à une URL inexistante pendant 10 minutes, de sorte que les requêtes ultérieures pour cette URL soient diffusées à partir du CDN. Si vous modifiez votre service pour que du contenu existe désormais à cette URL, le CDN continue de diffuser les erreurs 404 mises en cache pendant 10 minutes (au maximum), puis diffuse le contenu à partir de cette URL normalement.

Si une réponse 404 contient déjà des en-têtes de mise en cache définis par votre service Cloud Functions ou Cloud Run, ils remplacent la valeur par défaut de 10 minutes et déterminent entièrement le comportement de mise en cache du CDN.

Pour en savoir plus sur le comportement de mise en cache, consultez la documentation destinée aux développeurs Web de Google.

Définir Cache-Control

L'outil principal que vous utilisez pour gérer le cache du contenu dynamique est l'en-tête Cache-Control. En configurant cet en-tête, vous pouvez indiquer au navigateur et au CDN la durée pendant laquelle votre contenu peut être mis en cache. Dans votre fonction, vous définissez Cache-Control comme suit :

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

Dans cet exemple d'en-tête, les directives remplissent trois fonctions :

  • public : marque le cache comme public. Cela signifie que le navigateur et les serveurs intermédiaires (c'est-à-dire le CDN pour Firebase Hosting) peuvent mettre en cache le contenu.

  • max-age : indique au navigateur et au CDN le nombre de secondes pendant lesquelles ils peuvent mettre en cache le contenu. Lorsque le délai défini expire, le navigateur et le CDN doivent revalider le contenu auprès du serveur d'origine. Dans l'exemple d'en-tête, nous autorisons le navigateur et le CDN à mettre en cache le contenu pendant cinq minutes (voir s-maxage ci-dessous pour les commandes spécifiques de mise en cache du CDN).

  • s-maxage : remplace l'instruction max-age pour la mise en cache CDN uniquement et indique au CDN le nombre de secondes pendant lesquelles il peut mettre en cache le contenu. Lorsque le délai défini expire, le CDN doit revalider le contenu avec le serveur d'origine. Dans l'exemple d'en-tête, nous remplaçons le paramètre de max-age pour le CDN uniquement et autorisons le CDN à mettre en cache le contenu pendant 10 minutes.

Pour max-age et s-maxage, définissez leurs valeurs sur la durée la plus longue pendant laquelle vous acceptez que les utilisateurs reçoivent du contenu obsolète. Si une page change toutes les quelques secondes, utilisez une petite valeur temporelle. Toutefois, d'autres types de contenus peuvent être mis en cache en toute sécurité pendant des heures, des jours, voire des mois.

Pour en savoir plus sur l'en-tête Cache-Control, consultez le Mozilla Developer Network et la documentation destinée aux développeurs Web de Google.

Quand le contenu mis en cache est-il diffusé ?

Le navigateur et le CDN mettent en cache votre contenu en fonction des éléments suivants :

  • Nom d'hôte
  • Le chemin d'accès
  • Chaîne de requête
  • Le contenu des en-têtes de requêtes spécifiés dans l'en-tête Vary

En-têtes Vary

L'en-tête Vary détermine les en-têtes de requête à utiliser pour fournir une réponse appropriée (si le contenu mis en cache est valide ou s'il doit être validé à nouveau avec le serveur d'origine).

Firebase Hosting définit automatiquement un en-tête Vary approprié sur votre réponse pour les situations courantes. Dans la plupart des cas, vous n'avez pas besoin de vous soucier de l'en-tête Vary. Toutefois, dans certains cas d'utilisation avancés, vous devrez peut-être utiliser d'autres en-têtes pour affecter le cache. Dans ce cas, vous pouvez définir l'en-tête Vary sur votre réponse. Exemple :

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

Dans ce cas, la valeur de l'en-tête Vary est la suivante :

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

Avec ces paramètres, deux requêtes identiques avec des en-têtes X-My-Custom-Header différents sont mises en cache séparément. Notez que Hosting ajoute Cookie et Authorization à l'en-tête Vary par défaut lorsqu'une requête est effectuée pour un contenu dynamique. Cela garantit que tout en-tête d'autorisation de session ou de cookie que vous utilisez est intégré à la clé de cache, ce qui évite les fuites accidentelles de contenu.

Sachez également que :

  • Seules les requêtes GET et HEAD peuvent être mises en cache. Les requêtes HTTPS utilisant d'autres méthodes ne sont jamais mises en cache.

  • Soyez prudent lorsque vous ajoutez des paramètres à l'en-tête Vary. Plus vous ajoutez de paramètres, moins il est probable que le CDN puisse diffuser du contenu mis en cache. N'oubliez pas non plus que Vary est basé sur les en-têtes de requête, et non sur les en-têtes de réponse.

Utiliser des cookies

Lorsque vous utilisez Firebase Hosting avec Cloud Functions ou Cloud Run, les cookies sont généralement supprimés des requêtes entrantes. Cela est nécessaire pour permettre un comportement de cache CDN efficace. Seul le cookie __session spécialement nommé est autorisé à passer à l'exécution de votre application.

Lorsqu'il est présent, le cookie __session est automatiquement intégré à la clé de cache, ce qui signifie qu'il est impossible pour deux utilisateurs ayant des cookies différents de recevoir la réponse mise en cache de l'autre. N'utilisez le cookie __session que si votre application diffuse des contenus différents en fonction de l'autorisation de l'utilisateur.