{"id":20021,"date":"2026-06-15T08:34:43","date_gmt":"2026-06-15T06:34:43","guid":{"rendered":"https:\/\/webhosting.de\/http-conditional-caching-etag-last-modified-performance-guide\/"},"modified":"2026-06-15T08:34:43","modified_gmt":"2026-06-15T06:34:43","slug":"guide-de-performance-sur-la-mise-en-cache-conditionnelle-http-letag-et-la-date-de-derniere-modification","status":"publish","type":"post","link":"https:\/\/webhosting.de\/fr\/http-conditional-caching-etag-last-modified-performance-guide\/","title":{"rendered":"Comprendre la mise en cache conditionnelle HTTP avec ETag et Last-Modified"},"content":{"rendered":"<p>La mise en cache HTTP permet de gagner du temps et d'\u00e9conomiser des donn\u00e9es, car je ne recharge les ressources que lorsqu'elles ont r\u00e9ellement chang\u00e9. Via <strong>ETag<\/strong> et <strong>Derni\u00e8re modification<\/strong> Je v\u00e9rifie, \u00e0 l'aide d'une requ\u00eate conditionnelle, si le serveur r\u00e9pond par un code 304 Not Modified, ce qui r\u00e9duit consid\u00e9rablement le volume de donn\u00e9es transf\u00e9r\u00e9es et la charge du serveur.<\/p>\n\n<h2>Points centraux<\/h2>\n\n<p>Les points cl\u00e9s suivants montrent ce \u00e0 quoi je fais attention lors de la mise en cache conditionnelle avec <strong>ETag<\/strong> et <strong>Derni\u00e8re modification<\/strong> huit.<\/p>\n<ul>\n  <li><strong>Moins de trafic<\/strong>: Les fichiers inchang\u00e9s renvoient un code 304, et non l'int\u00e9gralit\u00e9 du corps de la requ\u00eate, ce qui r\u00e9duit sensiblement le volume de donn\u00e9es et la latence.<\/li>\n  <li><strong>Meilleure performance<\/strong>: Des temps d'attente plus courts am\u00e9liorent l'exp\u00e9rience utilisateur et les Core Web Vitals, ce qui <strong>SEO<\/strong> aide.<\/li>\n  <li><strong>Deux m\u00e9canismes<\/strong>: Les en-t\u00eates Last-Modified\/If-Modified-Since et ETag\/If-None-Match permettent de valider le cache de mani\u00e8re fiable.<\/li>\n  <li><strong>Contr\u00f4le du cache<\/strong>: Les directives contr\u00f4lent la dur\u00e9e de validit\u00e9, la mise \u00e0 jour et le comportement dans les caches interm\u00e9diaires.<\/li>\n  <li><strong>Combinaison<\/strong>: Ces deux m\u00e9thodes combin\u00e9es offrent une grande pr\u00e9cision et des solutions de secours simples.<\/li>\n<\/ul>\n<p>Je commence par v\u00e9rifier quelles ressources changent vraiment souvent et lesquelles changent rarement. Pour les fichiers rarement modifi\u00e9s, je d\u00e9finis un <strong>Derni\u00e8re modification<\/strong>- et j'ajoute un ETag. Pour les r\u00e9ponses dynamiques, je pr\u00e9f\u00e8re utiliser le <strong>ETag<\/strong>, car toute modification du contenu est imm\u00e9diatement perceptible. Cela me permet de soulager les serveurs, de r\u00e9duire les temps de latence et d'offrir des pages tr\u00e8s rapides aux visiteurs r\u00e9guliers. Cette strat\u00e9gie renforce la <strong>Core Web Vitals<\/strong> et donc, indirectement, la visibilit\u00e9.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/conditional-caching-8923.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Mise en cache conditionnelle HTTP : comment v\u00e9rifier la validit\u00e9<\/h2>\n\n<p>Lors d'une nouvelle requ\u00eate, le client envoie, en plus de la requ\u00eate GET, des en-t\u00eates suppl\u00e9mentaires que j'analyse c\u00f4t\u00e9 serveur. Si la ressource porte le m\u00eame <strong>ETag<\/strong> Si le contenu correspond \u00e0 celui du cache (If-None-Match), je renvoie un 304 Not Modified sans corps. Si l'horodatage n'a pas chang\u00e9 (If-Modified-Since), le serveur r\u00e9pond \u00e9galement par un 304. Si le jour ou la date ne correspondent plus, j'envoie un 200 OK avec un nouveau contenu et une version mise \u00e0 jour <strong>Derni\u00e8re modification<\/strong> et ETag. Cela me permet d'\u00e9conomiser de la bande passante, de maintenir le cache \u00e0 jour et d'assurer des temps de chargement nettement plus rapides.<\/p>\n\n<h2>\u00ab Last-Modified \u00bb et \u00ab If-Modified-Since \u00bb au quotidien<\/h2>\n\n<p>L'en-t\u00eate <strong>Derni\u00e8re modification<\/strong> Je me base sur la date et l'heure r\u00e9elles de modification du fichier, provenant par exemple du syst\u00e8me de fichiers. Si une requ\u00eate est ensuite envoy\u00e9e avec l'en-t\u00eate \u00ab If-Modified-Since \u00bb et que la ressource n'a pas chang\u00e9 depuis, je renvoie un code 304. Cette m\u00e9thode est simple, facile \u00e0 comprendre et id\u00e9ale pour les ressources statiques telles que les fichiers CSS, JS ou les images. Elle pr\u00e9sente toutefois des limites li\u00e9es \u00e0 la r\u00e9solution en secondes des horodatages HTTP et aux situations o\u00f9 le contenu change de mani\u00e8re logique sans qu\u2019il existe de date de modification pr\u00e9cise du fichier. L\u00e0 o\u00f9 Last-Modified atteint ses limites, un <strong>ETag<\/strong> le contr\u00f4le.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/meeting_http_caching_4573.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>ETag et If-None-Match dans les syst\u00e8mes dynamiques<\/h2>\n\n<p>A <strong>ETag<\/strong> Je le g\u00e9n\u00e8re sous forme de hachage, d'identifiant de version ou \u00e0 partir d'une colonne de base de donn\u00e9es qui signale les changements d'\u00e9tat. Lors d'un nouvel acc\u00e8s, le navigateur envoie un If-None-Match ; je compare le tag \u00e0 ma valeur actuelle et je r\u00e9ponds en cons\u00e9quence avec un 304 ou un 200. Cette comparaison d\u00e9tecte toute modification significative du contenu sans s'appuyer sur les horodatages des fichiers. Cela fournit des r\u00e9sultats tr\u00e8s pr\u00e9cis, en particulier pour les API, les pages composites ou les fragments personnalis\u00e9s. Il est important de veiller \u00e0 ce que les ETags restent coh\u00e9rents dans les environnements en cluster, afin qu\u2019aucun serveur n\u2019en attribue accidentellement un autre <strong>Jour<\/strong> produit.<\/p>\n\n<h2>Bien combiner les en-t\u00eates Cache-Control<\/h2>\n\n<p>Avec <strong>Contr\u00f4le du cache<\/strong> Je d\u00e9finis la dur\u00e9e pendant laquelle le contenu est consid\u00e9r\u00e9 comme \u00e0 jour sans v\u00e9rification et \u00e0 quel moment le navigateur proc\u00e8de \u00e0 une revalidation. Je d\u00e9finis des valeurs max-age adapt\u00e9es en fonction de la fr\u00e9quence des modifications et j'utilise must-revalidate lorsque des donn\u00e9es obsol\u00e8tes pourraient avoir des cons\u00e9quences critiques. Une longue dur\u00e9e de validit\u00e9 convient aux fichiers versionn\u00e9s, tandis que les r\u00e9ponses fr\u00e9quemment modifi\u00e9es ont une dur\u00e9e de vie plus courte et peuvent ensuite \u00eatre v\u00e9rifi\u00e9es de mani\u00e8re fiable via l'ETag ou la date. Je combine ainsi des temps de r\u00e9ponse courts avec une actualit\u00e9 correcte. Si vous souhaitez approfondir le sujet, vous trouverez de nombreux exemples sous <a href=\"https:\/\/webhosting.de\/fr\/http-controle-du-cache-strategies-hebergement-cachemaster\/\">Strat\u00e9gies de gestion du cache<\/a>, que j'utilise dans mon cabinet.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/http-caching-etag-concept-3892.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>D\u00e9roulement \u00e9tape par \u00e9tape d'une requ\u00eate GET conditionnelle<\/h2>\n\n<p>Lors de la premi\u00e8re requ\u00eate, le serveur renvoie un code 200 OK avec l'en-t\u00eate Cache-Control, <strong>Derni\u00e8re modification<\/strong> et l'ETag, le navigateur enregistre tout. Lors de la visite suivante, c'est l'anciennet\u00e9 dans le cache qui d\u00e9termine si une revalidation est n\u00e9cessaire. Si c'est le cas, le navigateur envoie une requ\u00eate avec les en-t\u00eates If-None-Match et\/ou If-Modified-Since. Si les valeurs correspondent \u00e0 l'\u00e9tat actuel, j'envoie un 304 Not Modified, et le client continue d'utiliser son cache. Si elles ne correspondent plus, un 200 OK est renvoy\u00e9 avec un nouveau corps et des donn\u00e9es mises \u00e0 jour <strong>donn\u00e9es de validation<\/strong>.<\/p>\n\n<h2>Comparaison : ETag et Last-Modified<\/h2>\n\n<p>Ces deux m\u00e9thodes me permettent d'exercer un contr\u00f4le, mais elles diff\u00e8rent en termes d'effort, de pr\u00e9cision et d'ad\u00e9quation. <strong>Derni\u00e8re modification<\/strong> se distingue par sa simplicit\u00e9 de mise en \u0153uvre et sa s\u00e9mantique claire, \u00e0 condition que je dispose d'horodatages pr\u00e9cis. L'ETag refl\u00e8te le contenu avec une grande pr\u00e9cision, mais sa g\u00e9n\u00e9ration n\u00e9cessite un peu de logique. Dans de nombreuses configurations, je combine les deux et b\u00e9n\u00e9ficie ainsi \u00e0 la fois de la simplicit\u00e9 et d'une reconnaissance pr\u00e9cise. Le tableau suivant r\u00e9sume les caract\u00e9ristiques typiques et aide \u00e0 prendre une d\u00e9cision.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th><strong>Aspect<\/strong><\/th>\n      <th><strong>Derni\u00e8re modification<\/strong><\/th>\n      <th><strong>ETag<\/strong><\/th>\n      <th><strong>Remarque<\/strong><\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Identit\u00e9<\/td>\n      <td>Date et heure de la derni\u00e8re modification<\/td>\n      <td>Hachage du contenu ou identifiant de version<\/td>\n      <td><strong>Temps<\/strong> vs. identifiant bas\u00e9 sur le contenu<\/td>\n    <\/tr>\n    <tr>\n      <td>D\u00e9tection des modifications<\/td>\n      <td>R\u00e9solution \u00e0 la seconde pr\u00e8s, indirecte<\/td>\n      <td>Directement ax\u00e9 sur le contenu<\/td>\n      <td>ETag d\u00e9tecte les plus infimes <strong>Diff\u00e9rences<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>mise en \u0153uvre<\/td>\n      <td>Tr\u00e8s l\u00e9ger, le syst\u00e8me de fichiers suffit<\/td>\n      <td>N\u00e9cessite une g\u00e9n\u00e9ration et une coh\u00e9rence<\/td>\n      <td>Les clusters ont besoin de la m\u00eame chose <strong>ETags<\/strong><\/td>\n    <\/tr>\n    <tr>\n      <td>Utilisation<\/td>\n      <td>Ressources statiques<\/td>\n      <td>R\u00e9ponses dynamiques<\/td>\n      <td>Cette combinaison couvre de nombreux <strong>cas<\/strong> \u00e0 partir de<\/td>\n    <\/tr>\n    <tr>\n      <td>R\u00e9ponses<\/td>\n      <td>304 sans modification de l'horodatage<\/td>\n      <td>304 pour une balise identique<\/td>\n      <td>200 en cas de modifications avec un nouveau <strong>Valeur<\/strong><\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/tech_office_caching_4721.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>En pratique : diffusion efficace des ressources statiques<\/h2>\n\n<p>Les fichiers statiques tels que les fichiers CSS, JS et les images changent rarement et se pr\u00eatent bien \u00e0 une longue <strong>max-age<\/strong>-Dur\u00e9es. Pour les fichiers versionn\u00e9s, je d\u00e9finis des dur\u00e9es \u00e9lev\u00e9es pouvant aller jusqu'\u00e0 un an et je les marque comme immuables afin que le navigateur les charge sans demander de confirmation. Pour les ressources non versionn\u00e9es, je choisis des d\u00e9lais plus courts et je m'appuie sur la revalidation via ETag et Last-Modified. Cela me permet d'\u00e9viter les contenus obsol\u00e8tes et de maintenir un trafic faible. Je veille \u00e0 ne pas <a href=\"https:\/\/webhosting.de\/fr\/http-cache-headers-saboter-la-mise-en-cache-cachefix\/\">Saboter les en-t\u00eates de cache<\/a> En laissant cela tel quel, j'obtiens un taux de r\u00e9ussite \u00e9lev\u00e9 dans le cache.<\/p>\n\n<h2>En pratique : API et pages dynamiques<\/h2>\n\n<p>En mati\u00e8re d'API, je mise g\u00e9n\u00e9ralement sur <strong>ETags<\/strong>, que je g\u00e9n\u00e8re \u00e0 partir du r\u00e9sultat s\u00e9rialis\u00e9 ou d'une colonne de version. Si l'enregistrement change, je g\u00e9n\u00e8re une nouvelle balise, ce que les clients d\u00e9tectent imm\u00e9diatement. Pour les contenus dont l'horodatage est incertain, je renonce souvent \u00e0 utiliser \u00ab Last-Modified \u00bb afin de ne pas donner une fausse impression de fra\u00eecheur. En compl\u00e9ment, je contr\u00f4le la dur\u00e9e de vie via \u00ab Cache-Control \u00bb et impose une revalidation apr\u00e8s expiration. Je maintiens ainsi la fra\u00eecheur des donn\u00e9es de mani\u00e8re fiable, sans alourdir inutilement les r\u00e9ponses.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/developer_desk_caching_3947.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Tests et surveillance du taux de r\u00e9ussite du cache<\/h2>\n\n<p>Je v\u00e9rifie les en-t\u00eates tels que <strong>ETag<\/strong>, Last-Modified, If-None-Match et If-Modified-Since dans les outils de d\u00e9veloppement. Je pr\u00eate alors attention aux codes de r\u00e9ponse, en particulier 304 par rapport \u00e0 200, afin d'\u00e9valuer l'efficacit\u00e9 de ma revalidation. Si le code 304 est rare, j'ajuste le Cache-Control, les dur\u00e9es de validit\u00e9 et la g\u00e9n\u00e9ration d'ETag. Les logs et les m\u00e9triques m'indiquent quels chemins g\u00e9n\u00e8rent des r\u00e9ponses inutilement volumineuses. Pour des am\u00e9liorations group\u00e9es, j'utilise volontiers un <a href=\"https:\/\/webhosting.de\/fr\/http-conditional-requests-cache-validation-optimisation-paquet\/\">Pack \u00ab Requ\u00eates conditionnelles \u00bb<\/a>, qui regroupe la configuration et les tests.<\/p>\n\n<h2>Architecture d'h\u00e9bergement et pi\u00e8ges ETag<\/h2>\n\n<p>Dans les configurations multi-serveurs, il faut un <strong>ETag<\/strong> \u00eatre ind\u00e9pendant de l'instance, sinon la reconnaissance \u00e9choue. Je veille \u00e0 ce que tous les n\u0153uds utilisent la m\u00eame logique et la m\u00eame cl\u00e9 pour la g\u00e9n\u00e9ration. Les proxys invers\u00e9s ou les CDN ne doivent pas modifier les ETags et doivent transmettre correctement les en-t\u00eates de condition. Lors de d\u00e9ploiements avec des empreintes d'actifs, j'\u00e9vite le recalcul des ETags c\u00f4t\u00e9 serveur si le fichier poss\u00e8de d\u00e9j\u00e0 une URL versionn\u00e9e. Des r\u00e8gles uniformes emp\u00eachent les r\u00e9ponses incoh\u00e9rentes et maintiennent un taux de r\u00e9ussite \u00e9lev\u00e9 du cache.<\/p>\n\n<h2>Actualisation vs validation : utiliser les directives avec pr\u00e9cision<\/h2>\n\n<p>Je fais clairement la distinction entre <em>fra\u00eecheur<\/em> (pendant combien de temps un cache peut-il utiliser une copie sans demander de confirmation ?) et <em>Validation<\/em> (comment v\u00e9rifier si elle est toujours valable ?). \u00c0 propos de <strong>Contr\u00f4le du cache<\/strong> Je contr\u00f4le les deux avec une grande pr\u00e9cision : <strong>max-age<\/strong> d\u00e9finit la dur\u00e9e de vie chez le client, <strong>s-maxage<\/strong> pour les caches partag\u00e9s tels que les proxys. <strong>public<\/strong> permet la mise en cache dans des caches partag\u00e9s, <strong>priv\u00e9<\/strong> il le limite au navigateur final. <strong>must-revalidate<\/strong> oblige \u00e0 demander des pr\u00e9cisions \u00e0 l'expiration, tandis que <strong>immuable<\/strong> \u00e9vite les revalidations inutiles pour les ressources versionn\u00e9es. <strong>no-cache<\/strong> n'interdit pas la mise en cache, mais exige syst\u00e9matiquement une revalidation ; <strong>no-store<\/strong> interdit en revanche totalement l'enregistrement. Les anciens <strong>Expire<\/strong>Je n'utilise les en-t\u00eates - que comme solution de secours ; je privil\u00e9gie syst\u00e9matiquement l'utilisation de Cache-Control. Et si je veux pallier les pannes, <strong>stale-while-revalidate<\/strong> et <strong>stale-if-error<\/strong>, afin de continuer \u00e0 diffuser les contenus dont la validit\u00e9 a expir\u00e9 r\u00e9cemment, pendant que je proc\u00e8de \u00e0 des mises \u00e0 jour en arri\u00e8re-plan ou que je contourne des erreurs.<\/p>\n\n<h2>ETags forts et faibles, compression et variantes<\/h2>\n\n<p>Je fais d\u00e9lib\u00e9r\u00e9ment la distinction entre les validateurs forts et les validateurs faibles. <strong>ETags forts<\/strong> identifient exactement la m\u00eame repr\u00e9sentation, octet par octet \u2013 id\u00e9al si je veux aussi <strong>Demandes de gamme<\/strong> souhaite exploiter efficacement. <strong>ETags faibles<\/strong> (Pr\u00e9fixe <code>W\/<\/code>) suffisent lorsque l'\u00e9quivalence s\u00e9mantique est suffisante, par exemple dans le cas de modifications de format mineures et sans incidence. Ce qui importe, c'est la mani\u00e8re de traiter <strong>Compression<\/strong>: Si je fournis \u00e0 la fois du contenu encod\u00e9 en gzip et en Brotli, un seul ETag ne doit pas s'appliquer \u00e0 toutes les variantes. Soit je g\u00e9n\u00e8re l'ETag \u00e0 partir de la version non compress\u00e9e, soit j'ajoute en plus un <strong>Vary : Accept-encodage<\/strong>, ou bien je g\u00e9n\u00e8re des ETags coh\u00e9rents mais diff\u00e9rents pour chaque variante. Cela me permet d'\u00e9viter les r\u00e9sultats erron\u00e9s et les r\u00e9ponses 200 qui devraient en r\u00e9alit\u00e9 \u00eatre des 304. Dans le cas de <strong>If-Range<\/strong> Je combine les requ\u00eates de mise \u00e0 jour avec un validateur : si l'ETag ou la date correspondent, je renvoie un statut 206 (Partial Content) ; sinon, je renvoie un statut 200 avec un corps complet, afin que le client dispose d'une base coh\u00e9rente.<\/p>\n\n<h2>Ma\u00eetriser parfaitement les en-t\u00eates Vary et la n\u00e9gociation de contenu<\/h2>\n\n<p>Chaque fois que le serveur fournit diff\u00e9rentes repr\u00e9sentations en fonction de la requ\u00eate, je d\u00e9finis <strong>Vary<\/strong> correct. Les candidats typiques sont <strong>Accept-Encoding<\/strong> (compression), <strong>Accepter la langue<\/strong> (localisation) ou des indicateurs de fonctionnalit\u00e9 sp\u00e9cifiques. J'\u00e9vite d'utiliser des en-t\u00eates volatiles tels que <strong>Agent utilisateur<\/strong> ou m\u00eame <strong>Cookie<\/strong> de varier, car cela r\u00e9duit consid\u00e9rablement le taux de r\u00e9ussite du cache. Lorsque la personnalisation est n\u00e9cessaire, je marque les r\u00e9ponses comme <strong>priv\u00e9<\/strong> ou <strong>no-store<\/strong> et les distingue clairement des ressources pouvant \u00eatre mises en cache publiquement. Important : les variantes concernent \u00e9galement les ETags \u2013 chaque variante doit disposer de son propre validateur coh\u00e9rent. Je m'assure ainsi que les navigateurs, les proxys et les CDN appliquent la m\u00eame logique et qu'aucune variante ne soit confondue par inadvertance avec une autre.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/06\/httpcaching-verstehen-2638.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Requ\u00eates conditionnelles au-del\u00e0 de GET<\/h2>\n\n<p>Les requ\u00eates conditionnelles ne s'appliquent pas uniquement \u00e0 la lecture. Pour les m\u00e9thodes d'\u00e9criture, j'utilise <strong>If-Match<\/strong> ou <strong>If-Unmodified-Since<\/strong>afin de <em>mises \u00e0 jour manquantes<\/em> pour \u00e9viter cela. Si, lors d'une requ\u00eate PUT ou DELETE, le client fournit l'ETag le plus r\u00e9cent via <strong>If-Match<\/strong> si c'est le cas, je n'effectue la modification que si l'\u00e9tat du serveur est toujours identique \u2013 sinon, je r\u00e9ponds par <strong>412 \u00c9chec de la condition pr\u00e9alable<\/strong>. Pour contr\u00f4ler les clients, le serveur peut \u00e9galement <strong>428 Condition pr\u00e9alable requise<\/strong> mettre en place. Pour des tests rapides sans body, j'utilise <strong>HEAD<\/strong>, qui me renvoie les m\u00eames en-t\u00eates qu'une requ\u00eate GET ; c'est id\u00e9al quand je veux tester des m\u00e9tadonn\u00e9es. Et avec <strong>304<\/strong>- Dans les r\u00e9ponses, je renvoie tous les en-t\u00eates pertinents pour la mise en cache (Cache-Control, ETag, Expires, Last-Modified) afin que le client actualise ses m\u00e9tadonn\u00e9es sans transmettre le corps du message.<\/p>\n\n<h2>S\u00e9curit\u00e9, protection des donn\u00e9es et conformit\u00e9<\/h2>\n\n<p>Je ne stocke pas de donn\u00e9es \u00e0 caract\u00e8re personnel ou de contenu sensible dans le cache public. \u00c0 cet \u00e9gard, j'applique <strong>Contr\u00f4le du cache : private<\/strong> ou <strong>no-store<\/strong>, afin qu'aucun navigateur ni aucune instance ne conserve le contenu. Attention aux comptes utilisateurs et aux tableaux de bord : les r\u00e9ponses contenant <strong>Cookie de configuration<\/strong> ou <strong>Autorisation<\/strong> ne doivent pas \u00eatre accidentellement accessibles en cache. Les ETags eux-m\u00eames peuvent \u00eatre utilis\u00e9s \u00e0 des fins de suivi s'ils restent stables pendant une longue p\u00e9riode. Je rem\u00e9die \u00e0 cela en n'utilisant activement les validateurs que l\u00e0 o\u00f9 la mise en cache est souhait\u00e9e, et en les d\u00e9sactivant pour les routes sp\u00e9cifiques \u00e0 l'utilisateur ou en limitant leur dur\u00e9e de vie. Je concilie ainsi performances et exigences en mati\u00e8re de protection des donn\u00e9es.<\/p>\n\n<h2>D\u00e9tails de mise en \u0153uvre et impact sur les performances<\/h2>\n\n<p>La cr\u00e9ation d'une balise ETag ne doit pas co\u00fbter plus cher que les avantages qu'elle procure. Pour les fichiers volumineux ou les rendus co\u00fbteux, j'enregistre la balise avec des m\u00e9tadonn\u00e9es (somme de contr\u00f4le du fichier, hachage de la version, base de donn\u00e9es-<em>version de la ligne<\/em>) et ne le r\u00e9capitule pas \u00e0 chaque requ\u00eate. Pour les pages composites, une <em>Strat\u00e9gie de gestion des versions<\/em>: Je construis l'ETag \u00e0 partir d'ETags partiels stables (par exemple, un mod\u00e8le, un fragment de donn\u00e9es, une configuration), de sorte que de petites modifications donnent lieu \u00e0 une nouvelle valeur cibl\u00e9e mais reproductible. Dans les clusters, je synchronise la logique de g\u00e9n\u00e9ration dans une biblioth\u00e8que commune et je la v\u00e9rifie en CI afin qu'aucune instance ne s'\u00e9carte. Pour les blobs extr\u00eamement volumineux, j'utilise des sommes de contr\u00f4le rapides (CRC64) ou j'enregistre des hachages de build au lieu de hacher le corps \u00e0 la vol\u00e9e. Lorsque l'\u00e9galit\u00e9 absolue des octets n'est pas n\u00e9cessaire, il suffit de <strong>ETags faibles<\/strong> comme un compromis pragmatique.<\/p>\n\n<h2>Erreurs fr\u00e9quentes et comment les \u00e9viter<\/h2>\n\n<ul>\n  <li><strong>ETags al\u00e9atoires<\/strong>: Si les balises sont r\u00e9g\u00e9n\u00e9r\u00e9es \u00e0 chaque requ\u00eate, toute revalidation perd tout son int\u00e9r\u00eat. Je veille \u00e0 ce que les valeurs soient d\u00e9terministes et ne changent qu'en cas de modification r\u00e9elle.<\/li>\n  <li><strong>Mauvais m\u00e9lange des directives<\/strong>: <em>no-store<\/em> L'utilisation de l'ETag ne sert \u00e0 rien : le navigateur ne met de toute fa\u00e7on pas en cache. Je choisis des combinaisons coh\u00e9rentes pour obtenir le comportement souhait\u00e9.<\/li>\n  <li><strong>Vary excessif<\/strong>: Les variations sur les cookies ou l'agent utilisateur vident le cache. Je limite l'utilisation de Vary aux v\u00e9ritables changements de repr\u00e9sentation.<\/li>\n  <li><strong>Pi\u00e8ges de compression<\/strong>: Un ETag commun pour gzip et br entra\u00eene des erreurs de reconnaissance. J'associe correctement les ETags \u00e0 la variante sp\u00e9cifique et je d\u00e9finis correctement l'en-t\u00eate Vary.<\/li>\n  <li><strong>D\u00e9calage horaire<\/strong>: Des horloges de serveur impr\u00e9cises faussent la date \u00ab Last-Modified \u00bb. Je synchronise les sources de temps afin que l'en-t\u00eate \u00ab If-Modified-Since \u00bb fonctionne correctement.<\/li>\n  <li><strong>Confusion avec \u00ab no-cache \u00bb<\/strong>: Beaucoup interpr\u00e8tent cela comme \u201e ne pas mettre en cache \u201c. Cela signifie en r\u00e9alit\u00e9 \u201e toujours revalider \u201c. Pour une interdiction effective, j'utilise <em>no-store<\/em>.<\/li>\n<\/ul>\n\n<h2>D\u00e9pannage, indicateurs et flux de travail<\/h2>\n\n<p>Pour le d\u00e9pannage, je commence par l'onglet R\u00e9seau : c'est bon <strong>Contr\u00f4le du cache<\/strong>? Intervient lors de la r\u00e9\u00e9ducation <strong>304<\/strong> au lieu de 200 ? \u00c7a me va <strong>ETag<\/strong> et <strong>Derni\u00e8re modification<\/strong> entre la demande et la r\u00e9ponse ? Je v\u00e9rifie <strong>Vary<\/strong>, pour v\u00e9rifier si les variantes sont correctement d\u00e9tect\u00e9es. Dans les journaux, je fais afficher <em>R\u00e9ussite\/\u00c9chec<\/em>- Afficher les taux de 304 et la taille moyenne des r\u00e9ponses par chemin. Lorsque le taux de 304 augmente, le volume de donn\u00e9es et le TTFB diminuent g\u00e9n\u00e9ralement de mani\u00e8re notable. Lors des tests de charge, je simule des requ\u00eates r\u00e9p\u00e9titives afin de mesurer les co\u00fbts de revalidation plut\u00f4t que les co\u00fbts de transfert. En cas d'anomalies, j'\u00e9limine progressivement les facteurs perturbateurs : Set-Cookie, r\u00e8gles Vary trop strictes, en-t\u00eates contradictoires comme Pragma. Je rep\u00e8re ainsi rapidement le goulot d'\u00e9tranglement qui fait baisser le taux de r\u00e9ussite.<\/p>\n\n<h2>Les Service Workers comme couche de mise en cache compl\u00e9mentaire<\/h2>\n\n<p>Si j'utilise un Service Worker, je l'utilise comme une couche suppl\u00e9mentaire, et non comme une couche contradictoire. Je lui confie les m\u00eames <strong>Contr\u00f4le du cache<\/strong>- Respecter les signaux et combiner des strat\u00e9gies telles que <em>stale-while-revalidate<\/em> avec une validation HTTP via ETag et Last-Modified. En mode hors ligne, le worker peut fournir des ressources l\u00e9g\u00e8rement obsol\u00e8tes et les revalider en arri\u00e8re-plan. Il est toutefois essentiel qu'il transmette correctement les en-t\u00eates de condition, sinon je perds les avantages du 304 sur la liaison r\u00e9seau. Ainsi, les sc\u00e9narios PWA b\u00e9n\u00e9ficient \u00e9galement d'une mise en cache HTTP propre, au lieu de contourner ses m\u00e9canismes.<\/p>\n\n<h2>Impact sur le r\u00e9f\u00e9rencement naturel et Core Web Vitals<\/h2>\n\n<p>Am\u00e9liorer les r\u00e9ponses rapides <strong>UX<\/strong> et les signaux des utilisateurs, ce qui favorise le r\u00e9f\u00e9rencement. Les visiteurs r\u00e9guliers en b\u00e9n\u00e9ficient tout particuli\u00e8rement, car leur navigateur r\u00e9cup\u00e8re de nombreux fichiers directement depuis le cache ou via une r\u00e9ponse 304. Cette latence r\u00e9duite a un effet positif sur les indicateurs FCP, LCP et TTFB, que je r\u00e9duis gr\u00e2ce \u00e0 une revalidation cibl\u00e9e. De plus, le serveur \u00e9conomise du temps de calcul, que je peux utiliser pour les pics de charge ou les requ\u00eates complexes. Je maintiens ainsi la performance tout en garantissant que le contenu s'affiche correctement et rapidement.<\/p>\n\n<h2>R\u00e9sum\u00e9 : mon plan d'action<\/h2>\n\n<p>Je mise sur une politique claire <strong>Combinaison<\/strong> \u00e0 partir des en-t\u00eates Cache-Control, Last-Modified et ETag. Pour les ressources statiques, j'opte pour des dur\u00e9es de vie longues et je m'assure de la revalidation lorsque les fichiers ne sont pas versionn\u00e9s. Pour les r\u00e9ponses dynamiques, je g\u00e9n\u00e8re des ETags fiables et assure la coh\u00e9rence des clusters. Je v\u00e9rifie ensuite \u00e0 l'aide d'outils, de m\u00e9triques et de journaux si les codes 304 apparaissent suffisamment souvent et j'ajuste les param\u00e8tres en cons\u00e9quence. Je garantis ainsi une diffusion rapide, une charge r\u00e9duite et une meilleure exp\u00e9rience utilisateur gr\u00e2ce \u00e0 une gestion efficace <strong>Mise en cache HTTP<\/strong>.<\/p>","protected":false},"excerpt":{"rendered":"<p>D\u00e9couvrez comment fonctionne la mise en cache conditionnelle HTTP avec les en-t\u00eates ETag et Last-Modified, comment mettre en \u0153uvre la validation du cache du navigateur et comment optimiser ainsi les temps de chargement, la bande passante et la charge du serveur.<\/p>","protected":false},"author":1,"featured_media":20014,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[834],"tags":[],"class_list":["post-20021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-plesk-webserver-plesk-administration-anleitungen"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"131","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":"1","_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"HTTP Caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"20014","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/20021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/comments?post=20021"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/20021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media\/20014"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media?parent=20021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/categories?post=20021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/tags?post=20021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}