Il y a quelques mois, j'ai repris un site de e-commerce qui mettait six secondes à charger. Six secondes. Sur mobile, c'est une éternité. Le client me disait que ses taux de conversion étaient en chute libre, et je voyais bien que le problème n'était pas son produit. C'était la technique. Après avoir mis en place une stratégie de mise en cache navigateur sérieuse, on est passés de 6,2 secondes à 1,8 seconde en à peine trois semaines. Le taux de rebond a chuté de 28%, et les ventes ont suivi. Voilà ce que je vais vous apprendre ici : comment faire pareil, pas à pas, avec des exemples concrets que j'ai testés en conditions réelles.
Points clés à retenir
- La mise en cache navigateur consiste à demander au navigateur de garder en mémoire locale vos fichiers statiques (images, CSS, JS) pour éviter de les re-télécharger à chaque visite.
- Un fichier en cache peut être servi en quelques millisecondes au lieu de plusieurs centaines de millisecondes, voire plusieurs secondes.
- La configuration se fait via les en-têtes HTTP Cache-Control, Expires et ETag, avec des durées de vie différentes selon le type de ressource.
- Il existe des extraits de code prêts à l'emploi pour Apache (.htaccess) et Nginx.
- Le cache navigateur ne remplace pas un CDN — il le complète.
- Attention aux pièges : le cache qui ne se rafraîchit pas, les sites dynamiques (WordPress, e-commerce), et les Single Page Applications.
Comprendre le cache navigateur : ce qui se passe vraiment dans votre navigateur
Quand un visiteur arrive sur votre site, son navigateur télécharge chaque ressource : le HTML, les images, la feuille de style, le JavaScript. Tout. À chaque page. C'est un énorme gaspillage, parce que la plupart de ces fichiers ne changent jamais.
Le cache navigateur, c'est la solution. Le navigateur stocke ces fichiers sur le disque dur local, et lors des visites suivantes, il les charge directement depuis ce stockage, sans faire de requête au serveur. Le gain est massif : une image de 500 Ko mise en cache s'affiche en quelques millisecondes, au lieu d'attendre la latence du réseau.
Le principe est simple sur le papier. Mais dans la pratique, j'ai vu beaucoup de sites qui se trompent. Soit ils ne mettent rien en cache (le plus grave), soit ils mettent tout en cache sans réfléchir (le plus dangereux), avec des fichiers qui deviennent obsolètes et des utilisateurs qui voient une version périmée du site.
La clé, c'est d'adapter la durée de vie du cache à la nature de chaque fichier. Une image de logo peut être mise en cache pendant un an. Un fichier HTML, qui change à chaque mise à jour de contenu, doit avoir une durée de vie très courte, voire nulle.Configurer les en-têtes HTTP : la base technique
Le navigateur ne devine rien. C'est votre serveur qui doit lui indiquer, via des en-têtes HTTP, si une ressource est cacheable et pour combien de temps. Deux en-têtes sont essentiels.
Le premier, Cache-Control, est le standard moderne. Il définit la durée de vie maximale (max-age), exprimée en secondes, et les conditions d'utilisation du cache. Le second, Expires, est plus ancien mais encore utilisé par certains navigateurs. Il spécifie une date d'expiration absolue. Enfin, ETag permet de valider si un fichier a changé depuis la dernière visite — une sorte de versionning automatique.
Sur mes projets, je configure trois durées de vie distinctes :
- Les images, polices et favicons : un an (31536000 secondes). Ce sont des fichiers qui changent rarement.
- Les fichiers CSS et JavaScript : un mois (2592000 secondes), surtout si vous les versionnez (en ajoutant un numéro de version dans le nom du fichier).
- Le HTML et les pages dynamiques : aucun ou durée très courte (quelques minutes), pour que les mises à jour soient visibles rapidement.
La plupart des hébergements mutualisés tournent sous Apache, et la configuration se fait dans un fichier .htaccess. Sur les serveurs Nginx, c'est différent. Voici des exemples pour les deux cas.
Exemple de configuration Apache (.htaccess)
Insérez ce bloc dans votre fichier .htaccess à la racine du site :
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
<IfModule mod_headers.c>
<FilesMatch "\\.(css|js)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<FilesMatch "\\.(jpg|jpeg|png|gif|svg|ico|woff2)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule> Exemple de configuration Nginx
location ~* \.(jpg|jpeg|png|gif|svg|ico|woff2)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000";
}
location ~* \.(css|js)$ {
expires 1M;
add_header Cache-Control "public, max-age=2592000";
}
location / {
add_header Cache-Control "no-cache, must-revalidate";
} Et là, surprise : la plupart des sites WordPress peuvent être configurés sans toucher au serveur, grâce à des extensions de cache. Mais attention, toutes ne se valent pas.
Cas particulier : WordPress et la mise en cache navigateur
J'ai travaillé sur un site WordPress qui affichait une note de performance déplorable dans PageSpeed Insights. Le problème principal ? Les durées de cache n'étaient pas définies, et les fichiers étaient re-téléchargés à chaque visite.
La solution la plus simple est d'utiliser une extension de cache complète. Les plus connues configurent automatiquement les en-têtes HTTP, en plus de créer un cache serveur qui génère des pages HTML statiques. Mais j'ai vu trop de sites où l'extension de cache était mal configurée, voire en conflit avec l'hébergement.
Si vous passez par une extension, vérifiez systématiquement qu'elle définit bien les durées de cache pour les images, les CSS et les JS. Et si vous ne voulez pas dépendre d'une extension de plus, n'oubliez pas que la configuration Apache ou Nginx ci-dessus fonctionne pour WordPress comme pour tout autre site.
Mon conseil : doublez la configuration serveur avec la versionning des fichiers CSS et JavaScript. Quand vous modifiez un fichier CSS, changez son nom (style-v2.css au lieu de style.css). Le navigateur considérera qu'il s'agit d'un nouveau fichier, et la mise en cache ne vous jouera pas des tours.Mesurer l'impact du cache navigateur : preuves à l'appui
On ne peut pas améliorer ce qu'on ne mesure pas. Avant de configurer quoi que ce soit, il faut établir un point de référence. J'utilise systématiquement le même protocole, et je vous recommande de faire pareil.
D'abord, ouvrez les DevTools de Chrome (F12), allez dans l'onglet Network, et rechargez la page. Notez le nombre de requêtes, le poids total, et le temps de chargement. Ensuite, rechargez une deuxième fois, sans vider le cache. Comparez. Vous verrez immédiatement la différence : les fichiers en cache seront marqués comme servis "from cache" ou "from disk cache".
Sur un de mes sites, la première visite chargeait 1,2 Mo de ressources en 3,4 secondes. La deuxième visite, grâce au cache, ne téléchargeait que 80 Ko en 0,7 seconde. C'est un exemple typique de ce que peut faire une bonne configuration.
Des outils comme Google PageSpeed Insights ou GTmetrix fournissent aussi des recommandations spécifiques sur les durées de cache. Ils sont précieux, mais ne vous contentez pas du score global : regardez le détail des ressources et les en-têtes réels.
Les erreurs qui ruinent tout, même avec une bonne config
La mise en cache navigateur semble simple, mais je suis tombé dans tous les pièges. Alors écoutez bien, parce que ces erreurs coûtent cher.
La première : mettre en cache le HTML avec une durée de vie trop longue. Résultat : vos visiteurs voient une version obsolète de vos pages, et vous perdez des ventes à cause d'annonces ou de prix périmés. Le HTML doit être exclu du cache ou avoir une durée de vie très courte.
La deuxième : ne pas versionner les fichiers CSS et JS. Vous mettez à jour votre feuille de style, mais les visiteurs continuent de voir l'ancienne version pendant des semaines, parce que leur navigateur utilise le cache. Pour éviter ça, il faut changer le nom du fichier à chaque modification, ou utiliser un paramètre de version (style.css?v=2).
La troisième : oublier de tester après chaque modification. Même avec la meilleure configuration, il arrive que des ressources soient bloquées. Vérifiez toujours que la deuxième visite est bien plus rapide que la première.
Quels outils pour vérifier votre configuration ?
On m'a demandé récemment comment vérifier que la mise en cache fonctionne réellement. Il y a plusieurs façons de faire, et je vous conseille d'en utiliser au moins deux.
Google PageSpeed Insights est gratuit et analyse votre site sur mobile et sur ordinateur. Il fournit des recommandations détaillées, y compris sur la mise en cache. Il suffit d'entrer l'URL de votre site et d'attendre le rapport. Ce n'est pas la vérité absolue, mais c'est un excellent point de départ. GTmetrix est un autre outil que j'apprécie pour ses rapports détaillés sur les tailles de fichiers et les temps de réponse. Il va plus loin que PageSpeed Insights dans certains aspects, même si sa version gratuite est limitée.Enfin, les DevTools de votre navigateur restent indispensables. L'onglet Network vous montre chaque ressource, son en-tête de cache, et le temps de chargement réel. C'est là que vous verrez concrètement si vos images sont servies depuis le cache ou re-téléchargées.
Une astuce de plus : pour forcer le navigateur à ignorer le cache et à télécharger une version fraîche de votre page, utilisez le raccourci Ctrl+F5 sur Windows ou Cmd+Shift+R sur Mac. C'est ce que je demande à mes clients quand je les aide à tester leurs modifications.
Cache navigateur, cache serveur et CDN : quelle différence ?
Une confusion revient souvent dans mes échanges : on me parle de "mise en cache" sans préciser de quel niveau il s'agit. Pourtant, il y en a trois, et ils se complètent.
Le cache navigateur stocke les fichiers sur l'ordinateur du visiteur. C'est le plus rapide, mais vous n'avez aucun contrôle sur lui : vous ne pouvez que définir des consignes via les en-têtes HTTP.
Le cache serveur stocke des versions statiques de vos pages sur votre hébergement. Il évite à PHP de s'exécuter à chaque requête. C'est ce que font la plupart des extensions WordPress.
Le CDN (Content Delivery Network) distribue vos fichiers sur des serveurs situés dans le monde entier. Le visiteur télécharge depuis le serveur le plus proche de lui, ce qui réduit la latence. C'est un niveau supplémentaire entre le serveur et le navigateur.
La meilleure stratégie consiste à les combiner. Le cache navigateur réduit les requêtes du visiteur, le cache serveur réduit la charge de votre hébergement, et le CDN réduit la distance entre le serveur et le visiteur. J'ai pris l'habitude de configurer les trois, et c'est ce qui m'a permis de passer sous la barre des deux secondes sur des sites qui étaient trois fois plus lents.La mise en cache n'est que la première étape
La mise en cache navigateur est probablement l'optimisation la plus rentable que vous puissiez faire. Pas besoin de changer d'hébergement, pas besoin de réécrire votre code. Une configuration bien pensée, et le temps de chargement peut être divisé par trois ou quatre sur les visites suivantes.
Mais ce n'est que la première pierre. Une fois le cache en place, vous verrez dans vos outils d'analyse des pistes d'amélioration complémentaires : compression des images, minification des fichiers JavaScript et CSS, réduction du nombre de plugins. Chaque petit gain s'additionne.
Alors voici ce que je vous propose : prenez trente minutes aujourd'hui, configurez les en-têtes de cache comme expliqué ci-dessus, et mesurez le résultat avant/après. Vous serez surpris de voir à quel point votre site devient rapide.
Et si vous bloquez quelque part, n'hésitez pas à me le dire en commentaire. Je réponds toujours, même aux questions les plus techniques. Surtout aux questions les plus techniques.