{"id":17058,"date":"2026-01-27T08:37:12","date_gmt":"2026-01-27T07:37:12","guid":{"rendered":"https:\/\/webhosting.de\/wordpress-browser-caching-fehler-serverboost\/"},"modified":"2026-01-27T08:37:12","modified_gmt":"2026-01-27T07:37:12","slug":"wordpress-erreur-de-cache-du-navigateur-boost-du-serveur","status":"publish","type":"post","link":"https:\/\/webhosting.de\/fr\/wordpress-browser-caching-fehler-serverboost\/","title":{"rendered":"WordPress et la mise en cache du navigateur - souvent mal configur\u00e9e"},"content":{"rendered":"<p>La mise en cache du navigateur WordPress provoque souvent des r\u00e9ponses lentes parce que les op\u00e9rateurs <strong>En-t\u00eate du cache<\/strong> mal d\u00e9finir ou ne pas contr\u00f4ler du tout. Je montre comment les erreurs de configuration typiques renvoient 200 au lieu de 304, pourquoi les TTL sont absents et comment je peux r\u00e9gler proprement la mise en cache dans WordPress. <strong>Performance<\/strong> trim.<\/p>\n\n<h2>Points centraux<\/h2>\n\n<ul>\n  <li><strong>TTL long<\/strong> pour les actifs statiques \u00e9vite les requ\u00eates inutiles.<\/li>\n  <li><strong>S\u00e9paration claire<\/strong> de chemins statiques et dynamiques prot\u00e8ge Admin et Login.<\/li>\n  <li><strong>Un syst\u00e8me<\/strong> configurer, ne pas m\u00e9langer des plugins de mise en cache concurrents.<\/li>\n  <li><strong>V\u00e9rifier les en-t\u00eates<\/strong> avec DevTools et assurer le statut 304.<\/li>\n  <li><strong>Mise en cache du serveur<\/strong> et le cache du navigateur se combinent judicieusement.<\/li>\n<\/ul>\n\n<h2>Comment la mise en cache du navigateur fonctionne r\u00e9ellement dans WordPress<\/h2>\n\n<p>Le navigateur stocke les fichiers statiques en local, ce qui permet d'\u00e9viter d'avoir \u00e0 les r\u00e9utiliser. <strong>Requ\u00eates HTTP<\/strong>. Lors de la deuxi\u00e8me visite, il lit les images, CSS et JS de la m\u00e9moire locale et ne demande au serveur que les modifications. Ainsi, la quantit\u00e9 de donn\u00e9es diminue, les temps de r\u00e9ponse baissent et le d\u00e9filement se sent imm\u00e9diatement <strong>liquide<\/strong> \u00e0 l'\u00e9cran. En l'absence d'instructions claires, le navigateur se recharge compl\u00e8tement \u00e0 chaque fois et le temps d'interaction en p\u00e2tit. Des en-t\u00eates de contr\u00f4le de cache correctement d\u00e9finis permettent des validations 304, r\u00e9duisent la bande passante et d\u00e9chargent PHP et la base de donn\u00e9es. Je l'utilise syst\u00e9matiquement, car ce sont justement les utilisateurs r\u00e9currents qui profitent au maximum de la mise en cache persistante.<\/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\/01\/wordpress-caching-problem-8392.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Pourquoi la configuration \u00e9choue souvent<\/h2>\n\n<p>De nombreux sites fournissent des fichiers statiques dont la dur\u00e9e est ridiculement courte. <strong>max-age<\/strong>-de la valeur de l'adresse. Certains plugins \u00e9crasent mutuellement le .htaccess et d\u00e9finissent des directives contradictoires. Souvent, le site marque mal les chemins d'acc\u00e8s admin, ce qui fait que le contenu de \/wp-admin ou \/wp-login.php se retrouve involontairement dans le cache et que les sessions entrent en conflit. Je v\u00e9rifie \u00e9galement la diff\u00e9rence entre le premier appel et l'appel r\u00e9current, car cela explique clairement les exp\u00e9riences r\u00e9elles des utilisateurs ; la comparaison s'y pr\u00eate bien <a href=\"https:\/\/webhosting.de\/fr\/wordpress-caching-comparaison-premier-appel-vitesse-lente\/\">Premier appel vs. r\u00e9current<\/a>. Si vous utilisez encore des cha\u00eenes de requ\u00eate sans versionnement, vous cr\u00e9ez de vieux fichiers en m\u00e9moire et vous vous \u00e9tonnez de ce que <strong>obsol\u00e8te<\/strong> Styles.<\/p>\n\n<h2>D\u00e9finir correctement les en-t\u00eates de cache WP<\/h2>\n\n<p>Je contr\u00f4le la dur\u00e9e avec <strong>Contr\u00f4le du cache<\/strong> et Expires, et j'\u00e9vite les balises ET ambigu\u00ebs dans les environnements multiserveurs. Pour Apache, je fixe des valeurs raisonnables pour Expires et je d\u00e9finis \u201epublic, max-age\u201c pour les assets. Pour Nginx, j'ajoute des directives add_header et je veille \u00e0 ce que HTML obtienne des dur\u00e9es courtes ou \u201eno-store\u201c lorsque le contenu est personnalis\u00e9. En outre, je d\u00e9sactive les en-t\u00eates ETag si les r\u00e9partiteurs de charge ou les proxys ne g\u00e9n\u00e8rent pas ces valeurs de mani\u00e8re coh\u00e9rente. Ainsi, j'impose un comportement clair au navigateur et j'\u00e9vite <strong>Revalidations<\/strong> \u00e0 chaque clic.<\/p>\n\n<pre><code>ExpiresActive On\n  ExpiresByType image\/jpeg \"access plus 1 year\"\n  ExpiresByType image\/png \"access plus 1 year\"\n  ExpiresByType text\/css \"acc\u00e8s plus 1 mois\"\n  ExpiresByType application\/javascript \"acc\u00e8s plus 1 mois\"\n\n\n\n  Header set Cache-Control \"public, max-age=31536000\" \"expr=%{CONTENT_TYPE} =~ m#^(image\/|font\/|application\/javascript)#\"\n  Header set Cache-Control \"no-cache, no-store, must-revalidate\" \"expr=%{REQUEST_URI} =~ m#(wp-admin|wp-login.php)#\"\n  En-t\u00eate unset ETag<\/code><\/pre>\n\n<pre><code># Nginx\nlocation ~* .(jpg|jpeg|png|gif|ico|webp|avif|css|js|woff2 ?)$ {\n    add_header Contr\u00f4le de cache \"public, max-age=31536000\" ;\n}\nlocation ~* \/(wp-admin|wp-login.php)$ {\n    add_header Contr\u00f4le de cache \"no-store\" ;\n}<\/code><\/pre>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2026\/01\/wordpress_caching_meeting_5823.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Des directives de contr\u00f4le de cache avanc\u00e9es au quotidien<\/h2>\n\n<p>Outre \u201emax-age\u201c et \u201eno-store\u201c, des directives modernes assurent une stabilit\u00e9 sensible. \u201eimmutable\u201c signale au navigateur qu'un fichier ne change pas tant que le nom du fichier reste le m\u00eame - id\u00e9al pour les assets versionn\u00e9s. \u201estale-while-revalidate\u201c permet de livrer une copie expir\u00e9e pendant qu'une mise \u00e0 jour est effectu\u00e9e en arri\u00e8re-plan. \u201estale-if-error\u201c tient une copie \u00e0 disposition lorsque l'Origin fournit bri\u00e8vement des erreurs. \u201es-maxage\u201c s'adresse aux proxys\/CDN et peut porter d'autres valeurs que \u201emax-age\u201c. Important \u00e9galement : \u201epublic\u201c autorise la mise en cache dans des proxys partag\u00e9s ; \u201eprivate\u201c se limite au navigateur. \u201eno-cache\u201c ne signifie pas \u201ene pas mettre en cache\u201c, mais \u201emise en cache autoris\u00e9e, mais \u00e0 revalider avant utilisation\u201c - une diff\u00e9rence d\u00e9cisive par rapport \u00e0 \u201eno-store\u201c.<\/p>\n\n<pre><code># Exemple Apache 2.4 (mise en cache des assets encore plus robuste)\n\n  Header set Cache-Control \"public, max-age=31536000, immutable, stale-while-revalidate=86400, stale-if-error=259200\" \"expr=%{REQUEST_URI} =~ m#.(css|js|woff2?|png|jpe?g|webp|avif)$#\"\n  Header set Cache-Control \"no-cache, must-revalidate\" \"expr=%{CONTENT_TYPE} =~ m#^text\/html#\"<\/code><\/pre>\n\n<pre><code># Exemple Nginx (304\/inclure les redirections)\nlocation ~* .(css|js|woff2?|png|jpe?g|webp|avif)$ {\n    add_header Cache-Control \"public, max-age=31536000, immutable, stale-while-revalidate=86400, stale-if-error=259200\" always ;\n}\nlocation ~* .html$ {\n    add_header Contr\u00f4le de cache \"no-cache, must-revalidate\" always ;\n}<\/code><\/pre>\n\n<h2>Dur\u00e9es de cache recommand\u00e9es par type de fichier<\/h2>\n\n<p>Je choisis les moments en fonction de la fr\u00e9quence des changements, pas de l'habitude, parce que <strong>Actifs<\/strong> vieillissent de mani\u00e8re tr\u00e8s diff\u00e9rente. Les images, logos et ic\u00f4nes restent g\u00e9n\u00e9ralement \u00e0 jour pendant longtemps, tandis que CSS\/JS subissent des it\u00e9rations plus fr\u00e9quentes. Les polices Web changent rarement, mais n\u00e9cessitent des en-t\u00eates CORS coh\u00e9rents. Le HTML sert souvent de conteneur pour les contenus dynamiques et peut donc \u00eatre court ou seulement r\u00e9vis\u00e9. Les API devraient recevoir des r\u00e8gles clairement d\u00e9finies afin que les clients puissent utiliser correctement les <strong>JSON<\/strong> contourner.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Type de fichier<\/th>\n      <th>Recommandation de contr\u00f4le du cache<\/th>\n      <th>Remarque<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Images (jpg\/png\/webp\/avif\/svg)<\/td>\n      <td>public, max-age=31536000<\/td>\n      <td>Utiliser le cache annuel avec le versionnement des fichiers<\/td>\n    <\/tr>\n    <tr>\n      <td>CSS\/JS<\/td>\n      <td>public, max-age=2592000<\/td>\n      <td>Ajouter la version au nom de fichier pour les mises \u00e0 jour<\/td>\n    <\/tr>\n    <tr>\n      <td>Fontes (woff\/woff2)<\/td>\n      <td>public, max-age=31536000<\/td>\n      <td>D\u00e9finir correctement l'origine du contr\u00f4le d'acc\u00e8s Allow<\/td>\n    <\/tr>\n    <tr>\n      <td>HTML (pages)<\/td>\n      <td>no-cache, must-revalidate ou max-age court<\/td>\n      <td>Tr\u00e8s prudent avec les contenus dynamiques<\/td>\n    <\/tr>\n    <tr>\n      <td>API REST (json)<\/td>\n      <td>private, max-age=0, must-revalidate<\/td>\n      <td>Diff\u00e9rencier selon le point final<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n<h2>\u00c9viter les conflits avec les plugins<\/h2>\n\n<p>Je mets tout au plus <strong>Plugin de mise en cache<\/strong> et v\u00e9rifier que l'h\u00e9bergement n'impose pas d\u00e9j\u00e0 des r\u00e8gles au niveau du serveur. Des combinaisons telles que W3 Total Cache plus WP Super Cache g\u00e9n\u00e8rent souvent des directives doubles qui s'annulent mutuellement. WP Rocket offre une mise en place rapide, mais n\u00e9cessite des exclusions claires pour les chemins dynamiques et le commerce \u00e9lectronique. Dans tous les cas, je contr\u00f4le le .htaccess g\u00e9n\u00e9r\u00e9 apr\u00e8s l'avoir enregistr\u00e9 afin de d\u00e9tecter les en-t\u00eates illogiques. Ensuite, je teste les pages critiques comme le checkout, le login et les tableaux de bord personnalis\u00e9s pour v\u00e9rifier qu'ils sont corrects. <strong>Contournement<\/strong>.<\/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\/01\/wordpress-browser-caching-fehler-9274.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Caching et cookies : utilisateurs connect\u00e9s, WooCommerce, sessions<\/h2>\n\n<p>Le HTML pour les utilisateurs connect\u00e9s ne doit pas se retrouver dans le cache public. WordPress utilise des cookies tels que <code>wordpress_logged_in_<\/code>, WooCommerce compl\u00e9t\u00e9 <code>woocommerce_items_in_cart<\/code>, <code>wp_woocommerce_session_<\/code> et d'autres. Au lieu d'utiliser le syst\u00e8me de <em>Vary : Cookie<\/em> je contourne compl\u00e8tement les caches pour ces demandes. Ainsi, les processus de caisse restent stables et les zones personnalis\u00e9es sont correctes. En outre, j'utilise des r\u00e8gles c\u00f4t\u00e9 serveur qui d\u00e9finissent des en-t\u00eates plus restrictifs en cas de d\u00e9tection de cookies.<\/p>\n\n<pre><code># Apache : d\u00e9tecter les cookies et d\u00e9finir des en-t\u00eates de contournement\n\n  SetEnvIfNoCase Cookie \"wordpress_logged_in_|woocommerce_items_in_cart|wp_woocommerce_session\" has_session\n  Header set Cache-Control \"private, no-store\" env=has_session<\/code><\/pre>\n\n<pre><code># Nginx : contournement bas\u00e9 sur les cookies\nif ($http_cookie ~* \"(wordpress_logged_in|woocommerce_items_in_cart|wp_woocommerce_session)\") {\n    add_header Contr\u00f4le de cache \"private, no-store\" always ;\n}<\/code><\/pre>\n\n<p>De nombreux plugins de mise en cache proposent des cases \u00e0 cocher \u00e0 cet effet (WooCommerce\/Cart\/Checkout exclure). Important : les nonces (<code>_wpnonce<\/code>) dans les formulaires et l'API Heartbeat g\u00e9n\u00e8rent des modifications fr\u00e9quentes. Je m'assure que le HTML frontal avec nonces n'est pas mis en cache de mani\u00e8re permanente ou fonctionne par \u201eno-cache, must-revalidate\u201c.<\/p>\n\n<h2>Traiter le HTML de mani\u00e8re cibl\u00e9e : personnalis\u00e9 vs. g\u00e9n\u00e9ral<\/h2>\n\n<p>Toutes les pages ne sont pas identiques. Les articles, les pages de renvoi et les pages juridiques peuvent souvent \u00eatre mis en cache avec un TTL court ou une revalidation. Les archives, les pages de recherche, les tableaux de bord, les zones de compte et les checkouts restent dynamiques. Si la mise en cache de pages est en jeu, je respecte la pratique suivante : mettre en cache le HTML public uniquement sans cookies, sinon \u201epriv\u00e9\u201c ou \u201eno-store\u201c. Ceux qui testent la micro-caching (par exemple 30-60 secondes pour des pages tr\u00e8s fr\u00e9quent\u00e9es et non personnalis\u00e9es) devraient d\u00e9finir des exclusions strictes pour les param\u00e8tres de requ\u00eate et les sessions. WordPress poss\u00e8de avec <code>DONOTCACHEPAGE<\/code> une constante que les templates peuvent mettre sur des pages d\u00e9licates - je l'utilise syst\u00e9matiquement pour \u00e9viter les erreurs.<\/p>\n\n<h2>Combiner judicieusement la mise en cache c\u00f4t\u00e9 serveur<\/h2>\n\n<p>La mise en cache du navigateur s'arr\u00eate au client, mais je d\u00e9charge en plus le serveur avec la mise en cache des pages, des objets et des opcodes pour de v\u00e9ritables <strong>Pics de charge<\/strong>. La mise en cache de pages fournit du HTML statique avant m\u00eame que PHP ne d\u00e9marre. Redis ou Memcached r\u00e9duisent les requ\u00eates r\u00e9p\u00e9t\u00e9es dans la base de donn\u00e9es et diminuent sensiblement le TTFB. OPcache tient \u00e0 disposition des fragments de bytecode PHP pr\u00e9compil\u00e9s et r\u00e9duit ainsi le temps d'ex\u00e9cution. En fin de compte, ce qui compte, c'est la connexion propre du cache du serveur et du cache du navigateur, afin que la deuxi\u00e8me visite soit pour ainsi dire \"normale\". <strong>instantan\u00e9<\/strong> agit.<\/p>\n\n<h2>Int\u00e9gration CDN sans surprise<\/h2>\n\n<p>Les CDN utilisent leur propre logique TTL et r\u00e9agissent \u00e0 \u201es-maxage\u201c. Je fais donc une distinction claire : \u201emax-age\u201c pour le navigateur, \u201es-maxage\u201c pour Edge. Si des d\u00e9ploiements sont pr\u00e9vus, je d\u00e9clenche une purge cibl\u00e9e au lieu de d\u00e9truire globalement \u201eCache Everything\u201c. Important : ne mettre en cache le HTML sur Edge que si aucun cookie n'est impliqu\u00e9. Dans le cas contraire, des \u00e9tats erron\u00e9s apparaissent, car le cache de l'Edge partage des r\u00e9ponses personnalis\u00e9es. Pour les assets, je d\u00e9finis des TTL longs et je me fie au versionnement des noms de fichiers. Les CDN peuvent ignorer les cha\u00eenes de requ\u00eate - une autre raison de pr\u00e9f\u00e9rer porter les versions dans le nom de fichier. La normalisation des en-t\u00eates (pas de valeurs \u201eVary\u201c superflues, \u201eContent-Type\u201c coh\u00e9rent) \u00e9vite les cl\u00e9s de cache gonfl\u00e9es.<\/p>\n\n<h2>Pas \u00e0 pas : une installation propre<\/h2>\n\n<p>Je commence par un plugin et j'y active la mise en cache du navigateur pour CSS, JS, les images et les polices, avant de <strong>.htaccess<\/strong> pour la finaliser. Ensuite, j'augmente le max-age pour les actifs statiques et j'ajoute des temps courts ou des r\u00e8gles de non-cache au HTML. Je d\u00e9sactive les balises ET si plusieurs serveurs sont impliqu\u00e9s et je me fie \u00e0 Last-Modified plus 304. Je d\u00e9clenche ensuite un pr\u00e9chargement pour que les pages importantes soient imm\u00e9diatement disponibles en tant que copies statiques. Enfin, je v\u00e9rifie les chemins d'acc\u00e8s \u00e0 la boutique, au login et \u00e0 l'administration afin d'\u00e9viter que des contenus priv\u00e9s ne soient publi\u00e9s sur le site. <strong>m\u00e9moire tampon<\/strong> atterrir.<\/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\/01\/wordpress-caching-office-2974.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Diagnostic pratique avec CLI et Header-Checks<\/h2>\n\n<p>DevTools sont obligatoires, mais je vais plus loin avec les tests CLI. Un <code>curl -I<\/code> montre les en-t\u00eates sans t\u00e9l\u00e9chargement ; avec <code>-H<\/code> je simule des conditions. Ainsi, je v\u00e9rifie si les revalidations renvoient vraiment 304, si \u201eAge\u201c augmente depuis un proxy\/CDN et si les cookies d\u00e9sactivent la mise en cache.<\/p>\n\n<pre><code># Afficher l'en-t\u00eate\ncurl -I https:\/\/example.com\/style.css\n\n# Simuler une revalidation (If-Modified-Since)\ncurl -I -H \"If-Modified-Since : Tue, 10 Jan 2023 10:00:00 GMT\" https:\/\/example.com\/style.css\n\n# Tester avec un cookie (devrait forcer le bypass)\ncurl -I -H \"Cookie : wordpress_logged_in_=1\" https:\/\/example.com\/<\/code><\/pre>\n\n<p>Je veille \u00e0 ce que les actifs portent une longue valeur de \u201econtr\u00f4le du cache\u201c, id\u00e9alement \u201eimmutable\u201c. Le HTML devrait avoir \u201eno-cache\u201c ou un TTL court. Si j'obtiens malgr\u00e9 tout 200 au lieu de 304, il s'agit souvent de redirections qui invalident les ETags\/Last-Modified. De m\u00eame, \u201eadd_header\u201c dans Nginx ne s'applique par d\u00e9faut qu'aux r\u00e9ponses de 200 - avec \u201ealways\u201c, je d\u00e9finis les en-t\u00eates \u00e9galement pour 304 et 301\/302.<\/p>\n\n<h2>Test et validation des en-t\u00eates<\/h2>\n\n<p>J'ouvre DevTools, je charge une fois la page, j'efface le cache et je charge \u00e0 nouveau pour trouver 304 en face. <strong>200<\/strong> d'observer la situation. Dans le panneau de r\u00e9seau, je contr\u00f4le le contr\u00f4le du cache, l'\u00e2ge, l'ETag\/le dernier modifi\u00e9 et la taille des r\u00e9ponses. Si, malgr\u00e9 tout, des r\u00e9ponses positives apparaissent au lieu de revalidations, je v\u00e9rifie les conflits avec les redirections, les cookies ou les cha\u00eenes de requ\u00eate. Pour les cas d\u00e9licats, cet article sur les pi\u00e8ges des en-t\u00eates m'aide : <a href=\"https:\/\/webhosting.de\/fr\/http-cache-headers-saboter-la-mise-en-cache-cachefix\/\">Saboter les en-t\u00eates de cache<\/a>. Apr\u00e8s chaque mise \u00e0 jour de plugin, je r\u00e9p\u00e8te le contr\u00f4le, car les modifications des r\u00e8gles sont souvent implicites. <strong>passer<\/strong>.<\/p>\n\n<h2>Versioning, CDN et cache busting<\/h2>\n\n<p>J'accroche les <strong>Version<\/strong> aux noms de fichiers (style.23.css au lieu de style.css?ver=23), afin que les navigateurs conservent de longs caches tout en chargeant imm\u00e9diatement les nouveaux contenus. Un CDN distribue les fichiers statiques de mani\u00e8re globale, d\u00e9finit ses propres TTL dans les Edge-PoPs et raccourcit drastiquement les RTT. Important : ne mettre en cache le HTML dans le CDN que si aucune personnalisation n'est n\u00e9cessaire, sinon des \u00e9tats erron\u00e9s apparaissent. Lors du d\u00e9ploiement, je modifie automatiquement le num\u00e9ro de version afin que les utilisateurs ne soient jamais bloqu\u00e9s par d'anciens scripts. Je combine ainsi des TTL de navigateur durs avec des TTL s\u00e9curis\u00e9s. <strong>Cache-busting<\/strong>.<\/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\/01\/wordpress-browsercache-setup2093.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Versionnement propre dans les builds WordPress<\/h2>\n\n<p>Le plus fiable est un pipeline de construction qui \u00e9crit les hachages dans les noms de fichiers (par exemple. <code>app.9f3c.css<\/code>). WordPress charge alors exactement ce fichier - les navigateurs peuvent le garder un an gr\u00e2ce \u00e0 \u201eimmutable\u201c. Comme solution de repli, lorsque les noms de fichiers ne peuvent pas \u00eatre modifi\u00e9s, je d\u00e9finis le num\u00e9ro de version de mani\u00e8re dynamique \u00e0 partir de la date du fichier. Ainsi, les cha\u00eenes de requ\u00eate restent correctes et fiables.<\/p>\n\n<pre><code>\/\/ functions.php (versionnement de repli via filemtime)\nadd_action('wp_enqueue_scripts', function () {\n    $css = get_stylesheet_directory() . '\/dist\/style.css' ;\n    $ver = file_exists($css) ? filemtime($css) : null ;\n    wp_enqueue_style('theme', get_stylesheet_directory_uri() . '\/dist\/style.css', [], $ver) ;\n}) ;<\/code><\/pre>\n\n<p>Important : si le nom de fichier porte des versions, il est possible de mettre \u201eimmutable\u201c. Si l'on n'utilise que des cha\u00eenes de requ\u00eate, les navigateurs doivent \u00eatre capables de revalider pour que les mises \u00e0 jour arrivent de mani\u00e8re fiable. Je veille \u00e9galement \u00e0 ce que les outils de construction nettoient les anciens fichiers, afin que les CDN ne stockent pas inutilement de nombreuses variantes.<\/p>\n\n<h2>Mettre en cache et charger correctement les polices web<\/h2>\n\n<p>Les polices web ont besoin de longs TTL, d'en-t\u00eates CORS corrects et, en option, de pr\u00e9chargement pour que <strong>Sauts de mise en page<\/strong> ne se produisent pas. Je place les fichiers woff2 sur le m\u00eame domaine ou je d\u00e9finis proprement Access-Control-Allow-Origin. En outre, je d\u00e9finis font-display : swap pour que le texte reste imm\u00e9diatement visible pendant le chargement de la police. Si vous souhaitez optimiser le temps de chargement de vos polices de mani\u00e8re cibl\u00e9e, vous trouverez ici des indications utiles : <a href=\"https:\/\/webhosting.de\/fr\/wordpress-webfonts-optimisation-du-temps-de-chargement-serverperf\/\">Chargement plus rapide des polices web<\/a>. Gr\u00e2ce \u00e0 des en-t\u00eates de cache propres et \u00e0 une pr\u00e9connexion aux CDN, je raccourcis consid\u00e9rablement le FOUT\/FOIT et garantis une connexion coh\u00e9rente. <strong>Rendu<\/strong>-r\u00e9sultats.<\/p>\n\n<h2>Accorder correctement les polices, CORS et Vary<\/h2>\n\n<p>Les polices d'une autre origine n\u00e9cessitent CORS. Je mets <code>Access-Control-Allow-Origin<\/code> de mani\u00e8re cibl\u00e9e (par exemple sur son propre domaine ou \u201e*\u201c pour truly public) et \u00e9vite de cr\u00e9er inutilement un <code>Vary : Origine<\/code>, qui gonfle les cl\u00e9s de cache. Pour les polices, il est recommand\u00e9 <code>public, max-age=31536000, immutable<\/code>. Preload am\u00e9liore First Paint, mais ne change rien \u00e0 la TTL - Preload et hard caching se compl\u00e8tent. Je n'oublie pas non plus que la livraison compress\u00e9e (<code>br<\/code>\/<code>gzip<\/code>) un <code>Vary : Accept-encodage<\/code> est n\u00e9cessaire pour que les proxys se s\u00e9parent correctement.<\/p>\n\n<h2>Erreurs typiques et solutions rapides<\/h2>\n\n<p>Si un ancien code arrive apr\u00e8s une mise \u00e0 jour, il manque souvent le <strong>Versionnement<\/strong> au nom du fichier. Si le navigateur se recharge compl\u00e8tement \u00e0 chaque fois, les en-t\u00eates d\u00e9finissent des instructions contradictoires ou les proxys les suppriment en cours de route. Si un checkout s'interrompt, le site met probablement en cache des pages de session ou des r\u00e9ponses API. Si les chemins d'acc\u00e8s admin glissent dans le cache, il manque des exclusions pour wp-admin et Login ou un plugin met globalement en cache. Je r\u00e9sous ce probl\u00e8me en d\u00e9sactivant progressivement, en consolidant les en-t\u00eates, en excluant les chemins critiques et en finissant par l'effet 304. <strong>confirme<\/strong>.<\/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\/01\/wordpress-caching-fehler-9834.png\" alt=\"\" width=\"1536\" height=\"1024\"\/>\n<\/figure>\n\n\n<h2>Des d\u00e9tails souvent n\u00e9glig\u00e9s qui font toute la diff\u00e9rence<\/h2>\n\n<ul>\n  <li><strong>Nginx add_header<\/strong> ne s'applique pas aux 304\/redirections sans \u201ealways\u201c - il manque alors des en-t\u00eates de cache pour les validations. Je mets syst\u00e9matiquement \u201ealways\u201c.<\/li>\n  <li><strong>Expires vs. Contr\u00f4le du cache :<\/strong> \u201eCache-Control\u201c a la priorit\u00e9, \u201eExpires\u201c sert de repli pour les anciens clients. \u00c9viter les indications doubles et contradictoires.<\/li>\n  <li><strong>ETag dans les configurations multiserveurs :<\/strong> Les balises ET incoh\u00e9rentes d\u00e9truisent les 304. Je d\u00e9sactive les balises ET ou j'utilise des validateurs faibles et je me fie \u00e0 \u201eLast-Modified\u201c.<\/li>\n  <li><strong>Vary au minimum :<\/strong> \u201eVary : Accept-Encoding\u201c est obligatoire en cas de compression, \u201eVary : Cookie\u201c fait gonfler les caches Edge - il vaut mieux contourner par cookie.<\/li>\n  <li><strong>SVG et type MIME :<\/strong> Correct <code>image\/svg+xml<\/code> donner des TTL longs et envisager des SVG en ligne pour les ic\u00f4nes critiques.<\/li>\n  <li><strong>\u00c9viter les cha\u00eenes de redirection :<\/strong> Chaque 301\/302 peut perdre des validateurs et en forcer 200 - des URL propres sans cascades.<\/li>\n  <li><strong>Utiliser la priorit\u00e9\/le pr\u00e9chargement de mani\u00e8re cibl\u00e9e :<\/strong> <code>fetchpriority=\"high\" (priorit\u00e9 de frappe)<\/code> ou Preload pour les assets critiques acc\u00e9l\u00e8re le premier appel ; la mise en cache agit sur le r\u00e9current.<\/li>\n  <li><strong>diff\u00e9rencier l'API REST :<\/strong> Les JSON publics, qui changent rarement, peuvent \u00eatre mis en cache bri\u00e8vement ; les points de terminaison avec jetons\/cookies strictement \u201epriv\u00e9s\u201c.<\/li>\n<\/ul>\n\n<h2>En bref<\/h2>\n\n<p>Je mise sur la clart\u00e9 <strong>R\u00e8gles<\/strong>: des TTL longs pour les assets, des r\u00e9ponses HTML courtes ou r\u00e9vis\u00e9es, le versioning et un seul plugin de mise en cache. Ensuite, je combine le cache du navigateur avec le cache des pages, des objets et des opcodes pour r\u00e9duire la charge du serveur. Je v\u00e9rifie DevTools, je regarde les 304, je contr\u00f4le les en-t\u00eates et j'\u00e9limine les conflits avec les redirections ou les cookies. Pour le test pratique, je compare les mesures lors du premier appel et des appels r\u00e9p\u00e9t\u00e9s et je me concentre sur les am\u00e9liorations sensibles. En suivant ces \u00e9tapes, WordPress peut \u00eatre mis en cache de mani\u00e8re fiable dans le navigateur. <strong>Vitesse<\/strong> et maintient la satisfaction des utilisateurs comme des moteurs de recherche.<\/p>","protected":false},"excerpt":{"rendered":"<p>WordPress et la mise en cache du navigateur sont souvent mal configur\u00e9s. Apprenez \u00e0 d\u00e9finir correctement les en-t\u00eates wp cache pour une performance optimale wordpress.<\/p>","protected":false},"author":1,"featured_media":17051,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[733],"tags":[],"class_list":["post-17058","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"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":"983","_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":"WordPress Browser 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":"17051","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/17058","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=17058"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/posts\/17058\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media\/17051"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/media?parent=17058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/categories?post=17058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/fr\/wp-json\/wp\/v2\/tags?post=17058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}