Docs · Cache

Mise en cache par étiquette avec DatoCMS et Astro.

Canner peut mettre en cache vos réponses rendues côté serveur et les invalider par étiquette. À la publication dans votre CMS, un webhook vide exactement les routes modifiées — vous servez donc depuis le cache entre les modifications au lieu d’appeler l’API de votre CMS à chaque page consultée.

La mise en cache s’applique au contenu rendu côté serveur. Pour Astro, cela veut dire l’adaptateur Node (@astrojs/node). Une compilation Astro entièrement statique n’appelle votre CMS qu’au moment de la compilation, elle n’a donc pas besoin de cache par requête — redéployez pour la rafraîchir.

1. Activez la mise en cache

Dans Paramètres → Cache de votre projet, activez Mise en cache des réponses. Cela place le cache de Canner devant votre application. Rien n’est mis en cache tant que vos réponses ne le demandent pas — voir l’étape 2.

2. Marquez les réponses comme cachables et étiquetez-les

Sur les routes à mettre en cache, posez un en-tête Cache-Control avecs-maxage, et étiquetez la réponse avec un Surrogate-Key par entité présente sur la page. Les étiquettes sont automatiquement limitées à votre projet, alors utilisez simplement des noms clairs et lisibles :

---
// src/pages/blog/[slug].astro  (output: 'server')
const post = await getPost(Astro.params.slug);

// Cache this response on Canner for an hour (until a purge or expiry).
Astro.response.headers.set(
  "Cache-Control",
  "public, s-maxage=3600"
);
Astro.response.headers.set(
  "Surrogate-Key",
  [`post-${post.id}`, "blog-listing"].join(" ")
);
---

Une même entité peut apparaître sur plusieurs routes (page de l’article, liste, page d’accueil). En étiquetant chaque réponse avec la clé de l’entité, une seule purge les vide toutes d’un coup. Après une purge, le prochain visiteur d’une route vidée déclenche un seul rendu frais, qui est ensuite remis en cache.

Vous préférez une seule ligne ? Installez @canner-ca/astro-cache : il pose les deux en-têtes correctement — y compris le public facile à oublier — et convertit pour vous les identifiants numériques de DatoCMS :

---
import { cache } from '@canner-ca/astro-cache';
const post = await getPost(Astro.params.slug);
cache(Astro.response, { ttl: 3600, tags: [post.id, 'blog-listing'] });
---

Vous utilisez Next.js ? Les composants serveur ne peuvent pas poser d’en-têtes de réponse; mettez donc les pages App Router en cache depuis middleware.ts (ou utilisez les Route Handlers / getServerSideProps). L’utilitaire @canner-ca/next-cache couvre les trois. Canner met en cache le document HTML et laisse passer les navigations RSC côté client, de sorte qu’une page en cache n’est jamais servie périmée lors d’une navigation douce.

Vous utilisez Nuxt ? Utilisez @canner-ca/nuxt-cache dans une page (cache(useRequestEvent(), …)), une route serveur ou un middleware. Nuxt récupère les charges utiles depuis des URL distinctes, donc les pages se mettent en cache proprement; Canner laisse passer toute requête x-nuxt-no-ssr pour que la coquille SPA ne soit jamais mise en cache.

3. Dirigez le webhook de votre CMS vers Canner

Dans Paramètres → Cache, générez un jeton de purge (affiché une seule fois). Dans DatoCMS, ajoutez un webhook déclenché à la publication/dépublication qui envoie :

  • URL : https://api.canner.ca/projects/<votre-slug>/cache/purge
  • Méthode : POST
  • En-tête : Authorization: Bearer <votre jeton de purge>

Canner lit automatiquement l’enregistrement modifié dans la charge utile de DatoCMS. Vous pouvez aussi envoyer un corps explicite pour vider des étiquettes précises :

curl -X POST https://api.canner.ca/projects/<your-slug>/cache/purge \
  -H "Authorization: Bearer <your purge token>" \
  -H "Content-Type: application/json" \
  -d '{"tags": ["post-123", "blog-listing"]}'

Envoyez les mêmes noms d’étiquettes que votre application a émis dans Surrogate-Key. Canner vide toutes les réponses en cache portant l’une de ces étiquettes — le tout limité à votre projet, donc vos étiquettes ne peuvent jamais toucher un autre site même si les noms coïncident.

Tout vider

Besoin de repartir à zéro ? Le bouton Tout vider dans Paramètres → Cache vide tout le cache du projet. Pratique après un redéploiement qui a modifié la mise en page ou des composants partagés.

Sites statiques : reconstruire au lieu de vider

Si votre site Astro est entièrement statique (sans @astrojs/node), il n’y a aucun cache par requête à vider — les pages ont été rendues au moment de la compilation. Dans ce cas, dirigez plutôt le webhook de votre CMS vers le point de terminaison rebuild, avec le même jeton de purge. Il redéploie votre projet depuis le dépôt GitHub connecté :

curl -X POST https://api.canner.ca/projects/<your-slug>/cache/rebuild \
  -H "Authorization: Bearer <your purge token>"

La reconstruction nécessite un projet connecté à GitHub (elle compile à partir du HEAD de votre dépôt). Les sites SSR devraient utiliser /cache/purge ci-dessus — c’est instantané et ça ne coûte pas une compilation.

Bon à savoir

  • Seules les réponses avec Cache-Control: public et un s-maxage positif sont mises en cache. Les réponses authentifiées ou avec Set-Cookie ne le sont jamais.
  • Les purges sont limitées à votre projet — vous ne pouvez jamais toucher le cache d’un autre locataire, et personne ne peut vider le vôtre sans votre jeton.
  • Les entrées expirent aussi d’elles-mêmes une fois le s-maxage écoulé; la purge n’est que le chemin rapide quand le contenu change plus tôt.