Choisissez les directives ou collez un en-tête existant. L’analyse porte sur le texte, pas sur le fonctionnement d’un cache réel.
Fonctionne localement dans votre navigateurLe panneau du haut compose une politique de réponse : choisissez une visibilité, indiquez une durée de fraîcheur en secondes, cochez les directives utiles puis cliquez sur Créer l’en-tête. L’en-tête que la page enverrait apparaît dans le champ En-tête de réponse avec un résumé de trois lignes — nombre de directives, fraîcheur de la réponse, portée autorisée — suivi de chaque conflit que contient la combinaison. Le panneau du bas fait l’inverse : collez une valeur copiée d’une réponse, d’un réglage de CDN ou d’un journal, cliquez sur Inspecter l’en-tête et lisez le même résumé pour ce texte. Les deux panneaux fonctionnent dans ce navigateur et la page reste utilisable hors connexion.
Cache-Control est le champ de réponse HTTP qui indique aux caches combien de temps une réponse peut être réutilisée et ce qui doit être vérifié avant : max-age et s-maxage fixent la durée pour les navigateurs et les caches partagés, no-store interdit le stockage, no-cache autorise le stockage mais exige une validation, et immutable, stale-while-revalidate et stale-if-error affinent l’ensemble. Cet outil lit le texte de l’en-tête selon la RFC 9111 et indique ce qu’un cache en ferait. Il ne contacte jamais d’URL : il ne peut donc pas dire ce que font réellement votre serveur, votre CDN ou le cache d’un navigateur en production.
public et private se contredisent : public marque la réponse comme stockable par les caches partagés et private l’interdit précisément à ces caches, l’une des deux doit donc disparaître. no-store est la directive la plus forte — rien ne peut être stocké —, ce qui rend max-age, s-maxage et les fenêtres de contenu périmé inutiles dans le même en-tête ; le résumé le dit au lieu d’afficher une durée qui ne s’appliquera jamais. s-maxage n’est lu que par les caches partagés et private les exclut : s-maxage à côté de private n’a donc aucun effet.
immutable promet que la ressource ne changera pas tant qu’elle est fraîche (RFC 8246) ; sans max-age ni s-maxage, aucune fenêtre de fraîcheur ne couvre cette promesse. must-understand accompagne no-store, et un cache qui comprend les exigences de mise en cache de ce code de statut ignore la partie no-store (RFC 9111, section 5.2.2.3). L’absence de durée est signalée elle aussi : sans max-age, s-maxage ni no-cache, un cache peut recourir à une heuristique — souvent un dixième du temps écoulé depuis Last-Modified — et réutiliser la réponse sans interroger l’origine.
max-age, s-maxage, stale-while-revalidate et stale-if-error prennent des delta-seconds, que la RFC 9111 définit comme un ou plusieurs chiffres (section 1.2.2) : 0 est valide et signifie périmé immédiatement, et le point décimal ne fait pas partie de la grammaire. Une valeur entre guillemets comme max-age="5" est signalée car l’émetteur doit utiliser la forme jeton (section 5.2.2.1). Les valeurs supérieures à 2147483647 secondes le sont aussi : un cache qui ne peut pas représenter ce nombre doit le lire comme 2147483648 secondes, plus de 68 ans, ce qui revient à ne jamais devenir périmé.
L’autre forme d’argument dans ce champ est la liste de noms de champs entre guillemets de no-cache et private, par exemple no-cache="Set-Cookie". Les virgules situées à l’intérieur de ces guillemets appartiennent à la liste : l’analyseur découpe donc le champ sur les virgules hors guillemets et compte une telle valeur comme une seule directive. Les directives qu’un cache ne reconnaît pas sont ignorées par ce cache (section 5.2.3), et c’est justement pourquoi une faute de frappe comme maz-age=60 mérite d’être signalée : la réponse serait quand même servie et la règle n’existerait tout simplement pas.
La page n’envoie jamais de requête : elle ne lit que le texte de l’en-tête. Qu’un CDN, un proxy inverse ou un navigateur respecte ce champ dépend de la configuration de ce système et du code de statut de la réponse, et un cache peut stocker une réponse sans aucune directive s’il la juge cacheable par heuristique. Vérifiez la politique sur la réponse réelle — curl -I, les en-têtes de cache annoncés par votre CDN ou le panneau réseau du navigateur — avant de vous y fier.
Deux voisins de ce champ restent volontairement de côté : Expires donne une date absolue au lieu d’une durée, et Pragma est un champ de requête HTTP/1.0 que la RFC 9111 rend obsolète (section 5.4). C’est pourquoi une ligne qui commence par un autre nom de champ est refusée plutôt que réétiquetée en Cache-Control. Et comme la vérification est textuelle, un en-tête parfaitement lisible peut rester inadapté au contenu : no-store sur une ressource statique ou un max-age d’un an sur une page qui change chaque heure sont des décisions qu’aucun analyseur ne peut prendre à votre place.