Tous les articles

Le cache HTTP tient en trois en-têtes

Mal réglé, il sert une version périmée pendant un mois ou fait tout retélécharger à chaque visite. Le réglage correct dépend d'une seule question.

·2 min de lecture

Deux pannes symétriques. Dans la première, une correction est en ligne mais les visiteurs voient l’ancienne version pendant des semaines. Dans la seconde, tout est retéléchargé à chaque visite et le site est lent pour ceux qui reviennent.

Les deux viennent du même réglage, poussé dans un sens ou dans l’autre.

La question qui décide

Cette adresse peut-elle servir un contenu différent demain ?

Si oui — une page HTML, une liste, un flux — le contenu doit être revalidé à chaque visite. Si non — un fichier dont le nom contient une empreinte de son contenu — il peut être conservé un an sans jamais être revérifié.

Tout le reste découle de là.

Les fichiers à empreinte

Un fichier nommé app.min.c8660be6….js porte dans son nom une empreinte de son contenu. Toute modification produit un nom différent, donc une adresse différente.

Cette adresse-là ne changera jamais de contenu. Elle mérite le réglage maximal :

Cache-Control: public, max-age=31536000, immutable

Le mot immutable évite même la requête de revalidation lorsque le visiteur actualise la page. Un an de cache, sans risque de servir une version périmée : c’est le nom de fichier qui change lors d’une mise à jour, pas le contenu servi à une adresse donnée.

Les pages

Une page HTML doit être revérifiée. Le compromis usuel :

Cache-Control: no-cache

Contrairement à ce que son nom suggère, no-cache n’interdit pas de stocker : il impose de revalider avant de servir. Avec un ETag, la revalidation renvoie un 304 Not Modified de quelques octets quand rien n’a bougé. Le visiteur paie un aller-retour, pas le contenu.

Pour interdire réellement le stockage — une page contenant des données personnelles sur un poste partagé — c’est no-store, et lui seul.

L’erreur classique : deux en-têtes concurrents

Les directives expires et add_header Cache-Control d’un serveur web émettent chacune leur en-tête. Les deux partent, et leur combinaison dépend de l’intermédiaire qui les lit.

Un seul en-tête, explicite, vaut mieux que deux qui se recouvrent partiellement.

Le cas des polices

Une police est immuable par nature, mais son nom ne porte généralement pas d’empreinte. Un an de cache reste le bon réglage — en acceptant que changer de police impose de changer le nom du fichier.

C’est un compromis raisonnable : une police change tous les trois ans, pas toutes les semaines.