Créer et analyser Cache-Control

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 navigateur
Tout dans cet outil est traité dans ce navigateur. VoriTools ne télécharge pas, ne stocke pas et n’appelle aucune API tierce avec votre entrée.
Politique de réponseChoisissez la politique que votre réponse d’origine enverra.
Inspecter une valeur Cache-ControlCollez uniquement la valeur de la directive ou une ligne d'en-tête complète.

Comment créer et analyser un en-tête Cache-Control

Le 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.

  1. Choisissez le destinataire dans Visibilité : public si des caches partagés peuvent stocker la réponse, private si la copie est destinée à un seul utilisateur, ou aucune visibilité explicite si le champ ne doit rien en dire. L’option est écrite dans l’en-tête exactement telle qu’elle s’affiche.
  2. Renseignez max-age pour les navigateurs et s-maxage lorsqu’un CDN ou un proxy inverse a besoin de sa propre durée. Les fenêtres facultatives — stale-while-revalidate et stale-if-error — et les cinq indicateurs ne sont ajoutés que si vous les utilisez. Les secondes sont des nombres entiers : 3600 et non 3600.9, que la page signale au lieu d’arrondir en silence.
  3. Cliquez sur Créer l’en-tête et lisez le champ En-tête de réponse : il contient la ligne du champ telle qu’elle serait envoyée, dans l’ordre où le formulaire énumère les directives. Le résumé en dessous les compte, indique la fraîcheur et la portée, et liste chaque conflit détecté : public avec private, no-store avec une durée, immutable sans max-age, s-maxage avec private.
  4. Pour vérifier un en-tête existant, collez-le dans le second panneau : la liste de directives seule ou la ligne Cache-Control complète. La forme entre guillemets est lue correctement, donc no-cache="Set-Cookie, Authorization" reste une seule directive. Les noms inconnus, les doublons, les delta-seconds entre guillemets et les valeurs qui ne sont pas des chiffres sont signalés au lieu d’être acceptés en silence.
  5. Copier place la ligne dans le presse-papiers et Télécharger l’enregistre sous cache-control.txt. Effacer remet le formulaire à ses valeurs par défaut — public avec max-age=3600 — et vide les deux panneaux, pour que l’exécution suivante parte d’un état connu. Quand une valeur ne peut pas être lue, la ligne d’état nomme le champ et la raison, et le champ d’en-tête est vidé au lieu de conserver le résultat précédent.

Conflits, delta-seconds et ce que cet outil ne peut pas voir

Les conflits que cet outil signale

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.

Delta-seconds : les nombres qu’un cache accepte

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.

Ce que cet outil ne peut pas vous dire

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.

Outils récents :