Les en-têtes HTTP Cache déterminent la manière dont les navigateurs et les proxys mettent en cache les contenus. S'ils sont mal configurés, ils ralentissent le temps de chargement et augmentent considérablement la charge du serveur. Dans cet article, je vous montre comment de petites erreurs d'en-tête peuvent affecter votre Stratégie de mise en cache saboter et comment vous pouvez gagner en rapidité de manière mesurable grâce à quelques corrections.
Points centraux
Les points clés suivants m'aident à vérifier rapidement les en-têtes HTTP et à les maintenir propres en permanence.
- TTL Faire le bon choix : mettre en cache les ressources statiques pendant très longtemps, les ressources HTML pendant une durée courte et contrôlée.
- Validation Utilisation : ETag et Last-Modified réduisent les requêtes inutiles.
- Conflits À éviter : les en-têtes Origin et CDN doivent correspondre.
- Gestion des versions Utilisation : les hachages de fichiers permettent des stratégies de mise en cache agressives.
- Suivi Établir : mesurer le taux de réussite et l'augmenter systématiquement.
Ce que contrôlent réellement les en-têtes de cache HTTP
Cache-Control, Expires, ETag et Last-Modified déterminent si les contenus sont récents, combien de temps ils sont valables et quand le navigateur effectue une requête. Avec max-age je définis la durée de vie, avec public/private l'emplacement de stockage dans le navigateur ou les caches partagés. Des directives telles que no-store empêchent complètement le stockage, no-cache impose une revalidation avant utilisation. Pour les fichiers statiques, une validité d'un an est recommandée, tandis que les fichiers HTML bénéficient de durées courtes avec une revalidation intelligente. Je m'appuie également sur immuable, lorsque la version hash garantit que les fichiers restent inchangés.
Ce contrôle a un impact direct sur la latence, la bande passante et la charge du serveur. Une augmentation de la Taux de HIT réduit les temps d'attente et diminue le travail en arrière-plan. En complément, j'optimise le transfert avec Compression HTTP, afin de réduire le nombre d'octets à transporter. Une séparation claire permet de soulager à la fois les CDN, les proxys et les caches des navigateurs. C'est ainsi que je garantis un fonctionnement sans faille. Temps de chargement par
Planification TTL dans la pratique
Le TTL approprié dépend de la fréquence des modifications, du risque et de la stratégie de restauration. Pour les actifs avec hachage de fichier, je fixe une durée de 12 mois, car je contrôle les modifications via les nouveaux noms de fichiers. Pour le HTML, je m'oriente vers la dynamique du contenu : les pages d'accueil ou les pages de catégories restent souvent à jour pendant 1 à 5 minutes, les pages détaillées avec commentaires pendant moins longtemps. Il est important de Chemin de restauration: Si une erreur se produit en direct, j'ai besoin d'une purge rapide (Edge) et d'une revalidation forcée (must-revalidate) pour les navigateurs. Les réponses API reçoivent des TTL courts, mais avec stale-Directives permettant aux utilisateurs de voir les réponses en cas d'erreur. Je documente ces profils par itinéraire ou type de fichier et les ancrage dans le pipeline de construction/déploiement afin qu'aucune modification „ silencieuse “ ne vienne involontairement compromettre la politique de fraîcheur.
Comment les erreurs de configuration sabotent la stratégie
Trop court TTLs comme max-age=60 secondes pour CSS, JS ou les images, imposent des requêtes constantes et détruisent les avantages du cache. Un no-cache Dans les configurations CMS, cela ralentit même lorsque de grandes parties d'une page sont en réalité stables. En l'absence d'ETag ou de Last-Modified, le navigateur recharge complètement les fichiers au lieu de les vérifier intelligemment. Les chaînes de requête superflues génèrent des Clés de cache et réduisent considérablement le taux de HIT. Si Origin envoie no-cache, le CDN ignore les caches périphériques, ce qui entraîne des chemins plus longs et une charge serveur plus élevée.
Je vois le résultat dans les métriques : plus de requêtes, plus de temps CPU et des temps de réponse de plus en plus longs. Lors des pics de trafic, le risque de délais d'attente augmente. Dans le même temps, la consommation de bande passante augmente sans que les utilisateurs n'en ressentent les avantages. En jetant un œil à DevTools, je repère rapidement ces schémas. Je commence alors par modifier Contrôle du cache, avant d'augmenter les ressources du serveur.
Recommandations par type de contenu : les directives appropriées
Selon le type de contenu, j'utilise différents En-tête, afin que les caches fonctionnent correctement et que les utilisateurs voient les données actuelles. Le tableau suivant présente les profils éprouvés que j'utilise dans mes projets.
| Contenu | Contrôle de cache recommandé | Validité | Remarque |
|---|---|---|---|
| JS/CSS/images (versionnées) | public, max-age=31536000, immuable | 12 mois | Utiliser le nom de fichier avec hachage (par exemple app.abc123.js) |
| Fichiers de polices (woff2) | public, max-age=31536000, immutable | 12 mois | Tenir compte des CORS s'ils sont chargés depuis CDN |
| HTML (public) | public, max-age=300, stale-while-revalidate=86400 | 5 minutes | Court fraîcheur, recharge en douceur en arrière-plan |
| HTML (personnalisé) | privé, max-age=0, no-cache | réhabilitation | Pas de transfert dans les caches partagés |
| APIs | public, max-age=60–300, stale-if-error=86400 | 1 à 5 minutes | Cas d'erreur avec stale amortir |
Ces profils couvrent des sites typiques et aident à obtenir rapidement des résultats cohérents. Règles Il est important de disposer d'un système de versionnement clair pour les ressources afin que les valeurs max-age longues ne fournissent pas de fichiers obsolètes. Le HTML reste éphémère et est mis à jour via la revalidation. Les API bénéficient de délais courts et d'un filet de sécurité via stale-if-error. Ainsi, les pages restent accessibles même en cas de dysfonctionnements. utilisable.
Mettre correctement en cache les codes d'erreur et les redirections
Les redirections et les pages d'erreur méritent leurs propres règles. 301/308 (permanents) peuvent être mis en cache très longtemps dans les CDN et les navigateurs ; je les définis souvent sur plusieurs jours, voire plusieurs semaines, afin d'éviter les chaînes de redirection. 302/307 (temporaire) reçoivent des TTL courts, sinon les états temporaires sont „ gelés “. Pour les 404/410, une fraîcheur modérée (par exemple, quelques minutes à quelques heures) est recommandée afin que les robots et les utilisateurs ne fassent pas de requêtes en permanence ; pour les contenus qui changent fréquemment, je considère que les 404 sont plutôt courts. 5xxJe ne mets généralement pas les erreurs en cache, mais j'utilise plutôt stale-if-error pour fournir temporairement des copies fonctionnelles. Cela permet de maintenir la stabilité de la plateforme et de réduire la charge de réaffichage pour les chemins fréquemment demandés mais manquants.
Utiliser correctement la validation : ETag et Last-Modified
Avec ETag et Last-Modified, le navigateur vérifie si une ressource doit vraiment être rechargée. Le client envoie If-None-Match ou If-Modified-Since, le serveur répond idéalement avec 304 au lieu de 200. Cela me permet d'économiser du transfert et de réduire le Trafic clair. Pour les fichiers statiques, Last-Modified suffit souvent, pour les contenus générés dynamiquement, j'utilise des ETags. Important : génération cohérente d'ETag afin que les caches puissent reconnaître les résultats.
J'aime combiner la validation avec stale-Directives. stale-while-revalidate maintient la rapidité des pages pendant la mise à jour en arrière-plan. stale-if-error garantit la fiabilité en cas de problèmes backend. L'expérience utilisateur reste ainsi stable et les serveurs sont ménagés. Les extraits suivants montrent les paramètres types que j'utilise.
Header set Cache-Control "public, max-age=31536000, immutable"
/etc/nginx/conf.d/caching.conf location ~* .(css|js|png|jpg|svg|woff2)$ { add_header Cache-Control "public, max-age=31536000, immutable"; }
Directives avancées et détails
En plus de max-age, j'utilise de manière ciblée s-maxage, pour remplir les caches périphériques plus longtemps que les navigateurs. Ainsi, le CDN peut par exemple tenir 1 heure, tandis que les clients revérifient après 5 minutes. must-revalidate Oblige les navigateurs à vérifier les copies expirées avant utilisation – important pour les domaines liés à la sécurité. proxy-revalidate applique l'obligation aux caches partagées. Avec no-transform j'empêche les proxys de modifier les images ou la compression sans autorisation. Pour une compatibilité étendue, j'envoie en option, en plus de Cache-Control, un Expire-Date dans le futur (actifs) ou dans le passé (HTML), même si les caches modernes respectent principalement le contrôle du cache. Dans les stratégies CDN, je sépare les règles du navigateur et celles de la périphérie : public + max-age pour les clients, plus s-maxage/Surrogate-Control pour la périphérie. Cette répartition maximise les taux de HIT sans risques de stagnation sur les terminaux.
Interaction avec les CDN et les caches périphériques
Un CDN respecte En-tête d'origine – Les directives incorrectes à la source désactivent les caches globaux. Pour les caches partagés, je définis public et, si nécessaire, s-maxage afin que les bords durent plus longtemps que les navigateurs. Surrogate-Control peut également fournir des règles pour les caches de bord. Si no-cache arrive à l'origine, le CDN refuse la requête souhaitée. Stockage. C'est pourquoi j'aligne délibérément la stratégie relative aux navigateurs et celle relative au CDN.
Pour les nouveaux projets, j'étudie également les stratégies de préchargement. Avec HTTP/3 Push & Preload Je charge les ressources critiques dès le début et réduis les blocages de rendu. Cette technique ne remplace pas la mise en cache, elle la complète. Associée à des TTL longs pour les ressources, elle améliore sensiblement les performances de démarrage. Je travaille ainsi sur le classement du réseau avant que le Serveur commence à transpirer.
La stratégie Vary en détail
Vary décide quelles en-têtes de requête génèrent de nouvelles variantes. Je considère Vary comme minimal : pour HTML, généralement Accept-Encoding (compression) et, le cas échéant, la langue ; pour les actifs, idéalement pas du tout. Un Vary trop large (par exemple, User-Agent) détruit le taux de HIT. Dans le même temps, il faut ETags le spécifique à la représentation Refléter la variante : si je fournis gzip ou br, les ETags s'appliquent par variante d'encodage et je définis Vary : Accept-Encoding. Si j'utilise des ETags faibles (W/), je veille à les générer de manière cohérente, sinon il y a des 200 inutiles. Les polices ou les images doivent généralement fonctionner sans Vary ; ainsi, les clés restent stables. Mon principe : définir d'abord quelles variantes sont nécessaires d'un point de vue technique, puis étendre Vary, jamais l'inverse.
Surveillance et diagnostic dans DevTools
Je commence toujours dans le Onglet Réseau des outils du navigateur. Je peux y voir si les réponses proviennent du cache, leur ancienneté et les directives qui s'appliquent. Les colonnes Âge, Contrôle du cache et Statut permettent d'effectuer des vérifications rapides. Un taux de réussite inférieur à 50% indique qu'il est nécessaire d'agir, des valeurs cibles de 80% et plus sont réalistes. En cas d'écarts, je vérifie d'abord les en-têtes correspondants.
Des outils tels que PageSpeed ou GTmetrix ont confirmé mes impressions locales. Mesures. Je compare ensuite avant/après les modifications afin de quantifier les avantages. Si des volumes de transfert importants s'ajoutent, j'active systématiquement la compression moderne. Cela me permet de gagner quelques millisecondes supplémentaires. Je vérifie ainsi chaque réglage avec des tests rigoureux. chiffres.
Contrôles automatisés et CI
Pour éviter que les règles ne soient contournées, j'intègre des vérifications d'en-tête dans l'infrastructure de compilation. Je définis des profils cibles pour chaque chemin d'accès et je les vérifie de manière aléatoire dans chaque build par rapport à la mise en scène. De simples vérifications shell suffisent souvent :
# Exemple : directives attendues pour les ressources versionnées curl -sI https://example.org/static/app.abc123.js | grep -i " cache-control " # Échéance et revalidation attendues pour HTML
curl -sI https://example.org/ | egrep -i "cache-control|etag|last-modified" # Inspecter l'en-tête Age et l'état du cache (le cas échéant) curl -sI https://example.org/styles.css | egrep -i "age|cache-status|x-cache"
En combinaison avec des tests synthétiques, je prévois des „ audits d'en-tête “ réguliers. Les résultats sont réintégrés dans le code de l'infrastructure. Ainsi, Politiques stable – indépendamment de la dernière personne à avoir modifié le CMS, le CDN ou la configuration du serveur.
Optimisation de l'hébergement : mise en cache des pages, des objets et des codes opérationnels
Outre les caches du navigateur et du CDN, je mise sur Caches serveur. La mise en cache des pages fournit des pages HTML prêtes à l'emploi, la mise en cache des objets met en mémoire tampon les résultats de la base de données et OPcache traite le bytecode PHP. Ces couches soulagent considérablement le backend lorsque les en-têtes sont correctement définis. Seule la combinaison de bords rapides, de TTL sains et de caches serveur permet d'obtenir de véritables valeurs de pointe. Cela me permet de maintenir des temps de réponse stables, même lorsque Trafic augmente.
L'aperçu du marché suivant montre ce à quoi je prête attention en matière d'hébergement. Un taux de réussite élevé, la disponibilité de Redis et un prix avantageux sont les critères qui motivent mon choix.
| Fournisseur d'hébergement | Score PageSpeed | Prise en charge Redis | Prix (débutant) |
|---|---|---|---|
| webhoster.de | 98/100 | Oui | 4,99 € |
| Autre1 | 92/100 | En option | 6,99 € |
| Autre2 | 89/100 | Non | 5,99 € |
Stratégies d'invalidation et de purge
La constitution d'un cache n'est que la moitié du chemin – la Invalidation détermine la sécurité et l'agilité. Pour les actifs, je déclenche les modifications via des hachages de fichiers, ce qui évite d'avoir à effectuer des purges. Pour le HTML et les API, je planifie des purges ciblées : après le déploiement (routes critiques), après la publication (uniquement les pages concernées) ou après les indicateurs de fonctionnalité. Je prends volontiers en charge les caches périphériques via des balises/clés afin de Groupes plutôt que de traiter les chemins individuellement. Dans la mesure du possible, j'utilise „ Soft Purge “ : les contenus sont immédiatement marqués comme „ obsolètes “ et ne sont revalidés qu'à la prochaine requête. Cela me permet d'éviter les pics de charge dus à des re-fetches simultanés. Il est important d'avoir un mappage organisé : quels événements déclenchent quelle purge ? Cette logique doit être versionnée dans la plateforme.
Sécurité et protection des données : public vs privé
Les pages personnalisées font partie des Cache privé du navigateur, et non dans des caches partagés. C'est pourquoi je définis private, max-age=0 ou no-cache pour ce type de contenu. Les pages HTML publiques peuvent obtenir public avec une courte durée de fraîcheur. Si je fais attention aux cookies dans la requête, le contenu reste bien séparé. J'empêche ainsi les utilisateurs étrangers d'accéder involontairement Données d'autres voient.
En même temps, j'applique des règles strictes pour les zones de paiement ou de compte. no-store empêche tout stockage de réponses sensibles. Pour le reste du site, je reste généreux afin que les performances soient au rendez-vous. Cette séparation claire permet de garantir la rapidité et la sécurité de la plateforme. Je documente les Profils, afin que toutes les parties prenantes restent cohérentes.
Comprendre la mise en cache heuristique
En l'absence de Cache-Control et Expires, les caches accèdent à heuristiques retour – environ un pourcentage du temps écoulé depuis la dernière modification. Cela conduit à des résultats difficilement reproductibles et à une fraîcheur variable. J'évite ces automatismes en attribuant explicitement Cache-Control à chaque route pertinente. Lorsque Last-Modified est imprécis (par exemple dans le cas de modèles dynamiques), je préfère utiliser les ETags. Cela me permet de contrôler activement la fraîcheur et d'obtenir des métriques stables sur tous les clients.
Demandes de plage et fichiers volumineux
Pour les médias et les téléchargements, cliquez ici gammeLes requêtes (206 Partial Content) jouent un rôle important. J'active Accept-Ranges et fournis des ETags/Last-Modified cohérents afin que les navigateurs puissent réutiliser correctement les parties. Pour les segments vidéo versionnés (HLS/DASH), je définis des TTL longs ; les manifestes eux-mêmes restent éphémères. Important : gérer correctement If-Range afin que les sous-domaines ne conduisent pas à des états mixtes obsolètes en cas de modifications. Pour les contenus sensibles, la règle suivante s'applique toujours : pas de stockage avec no-store, même si Range est en jeu.
Correction rapide des erreurs courantes : mon guide pratique
Je commence par un inventaire des en-têtes : lesquels directives fourni par Origin et que modifie le CDN ? Ensuite, je définis des profils TTL par type de contenu. Les ressources versionnées obtiennent un an, le HTML cinq minutes plus une revalidation. J'active ETag/Last-Modified partout où cela est pertinent. Ensuite, je vérifie si des paramètres Vary ou Query inutiles affectent le Taux de HIT Appuyez sur .
Dans l'étape suivante, je m'occupe des détails réseau en dehors du cache. Une erreur En-tête Charset ou l'absence de compression coûte également du temps. Ensuite, je procède à une nouvelle mesure : DevTools, tests synthétiques et, si nécessaire, surveillance des utilisateurs réels. Si les valeurs sont correctes, je fige les règles dans la configuration et les conserve dans une version. C'est ainsi que la Qualité Pas à pas.
En bref
Avec des En-têtes HTTP Je contrôle où et combien de temps les données sont stockées, ce qui me permet d'économiser du temps et des ressources. Des TTL longs pour les ressources versionnées, des durées courtes et une revalidation pour le HTML, ainsi que des directives stale pertinentes apportent rapidité et résilience. Des clés de cache propres, un versionnage cohérent et des règles claires pour les données publiques/privées permettent d'éviter les écueils habituels. La surveillance fournit des preuves et met en évidence les lacunes restantes. En procédant ainsi, vous augmentez la Performance sensible et stable.


