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 :
$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 :
Cache-Status: MonApp; hit; ttl=58
Cache-Status: MonApp; fwd=miss; stored
Cache-Status: MonApp; fwd=stale; fwd-status=304- servie par le cache, encore fraîche pendant 58 secondes ;
- absente du cache : demandée à l'application, puis stockée ;
- 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
CDN-Cache-Controln'agit que sur un CDN qui l'implémente : à vérifier chez le vôtre avant de raccourcir la durée navigateur.Cache-Statusdécrit votre cache à quiconque lit les en-têtes, d'où sa désactivation par défaut. Contrairement à l'en-tête de débogageX-Symfony-Cache, il reste utilisable en production.
Source : New in Symfony 8.2: Targeted Cache-Control and Cache-Status Headers, blog Symfony, 5 octobre 2026. Pull request : symfony/symfony#65573.