veilletech.fr
6 oct. Feed du jour
#02 SYMFONY Article

Symfony 8.2 : le CDN a son propre Cache-Control

Une durée pour le CDN, une autre pour le navigateur. Enfin séparées.

Symfony 8.2 gère les en-têtes Cache-Control ciblés de la RFC 9213 : une méthode cacheControl('CDN') sur la réponse pose des règles propres au CDN, distinctes de celles du navigateur. Il ajoute aussi l'en-tête Cache-Status de la RFC 9211, désactivé par défaut, qui dit si la réponse vient du cache, de l'application ou d'une revalidation.

2 min de lectureintermédiairevidéo 1:21
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Une durée par cache
  3. Ce que le cache a fait
  4. Les limites
  5. À retenir

Ce qui se passe

Symfony 8.2 prend en charge deux en-têtes HTTP liés au cache : les Cache-Control ciblés (RFC 9213), pour donner à chaque cache ses propres règles, et Cache-Status (RFC 9211), pour savoir ce qu'un cache a fait d'une requête.

Une durée par cache

Un CDN se purge quand le contenu change ; le cache du navigateur d'un visiteur, jamais. On veut donc souvent une longue durée côté CDN et une courte côté navigateur. Un CDN qui comprend CDN-Cache-Control l'applique à la place de Cache-Control, que le navigateur continue de suivre seul.

Dans Symfony 8.2, la méthode cacheControl() de la réponse prend le nom de la cible — CDN, pas le nom complet de l'en-tête :

PHP
$response->setPublic();
$response->setMaxAge(60);               // navigateur : Cache-Control

$cdn = $response->cacheControl('CDN');  // CDN : CDN-Cache-Control
$cdn->setPublic();
$cdn->setMaxAge(3600);

L'objet renvoyé expose setPublic(), setPrivate(), setStaleIfError(), setMaxAge(), et set() pour toute autre directive. Il n'a pas de setSharedMaxAge() : la cible désigne déjà le cache concerné.

Ce que le cache a fait

Cache-Status s'active par la nouvelle option cache_status du cache HTTP de Symfony, qui reçoit le nom sous lequel votre cache se présente. Elle vaut null par défaut. Les trois situations décrites par Symfony, écrites ici dans la syntaxe de la RFC 9211 avec un nom d'exemple :

TEXT
Cache-Status: MonApp; hit; ttl=58
Cache-Status: MonApp; fwd=miss; stored
Cache-Status: MonApp; fwd=stale; fwd-status=304
  1. servie par le cache, encore fraîche pendant 58 secondes ;
  2. absente du cache : demandée à l'application, puis stockée ;
  3. périmée, mais l'application a répondu 304 Not Modified : le cache réutilise sa copie.

Un ttl négatif signale une réponse périmée servie malgré tout. Si un autre cache a déjà posé l'en-tête, Symfony ajoute sa propre entrée : on suit la réponse de cache en cache.

Les limites

Source : New in Symfony 8.2: Targeted Cache-Control and Cache-Status Headers, blog Symfony, 5 octobre 2026. Pull request : symfony/symfony#65573.