Audit de compression et de cache

Deux en-têtes de réponse décident combien d’octets circulent à la première visite et combien repartent à la visite suivante. Cet audit les lit sur votre page et sur quatorze de ses fichiers au plus.

Ou essayez mozilla.org, wordpress.org

Un court échange dans les en-têtes

À chaque requête, le navigateur annonce les formats de compression qu’il sait décompresser :

Accept-Encoding: gzip, deflate, br, zstd

Un serveur où la compression est activée en choisit un, réduit le fichier et étiquette la réponse Content-Encoding: br (Brotli) ou gzip. Le HTML, le CSS et le JavaScript sont du texte répétitif et perdent en général de 70 à 85 % de leur taille. Les fichiers JPEG, PNG, WebP, AVIF et WOFF2 sont déjà compressés par leur propre format : les envoyer tels quels est donc la bonne décision.

Le cache est l’autre moitié du travail. Cache-Control: max-age=31536000 permet au navigateur de réutiliser un fichier pendant un an sans rien demander. Une fois la durée écoulée, un en-tête ETag ou Last-Modified lui permet de poser une question peu coûteuse, « est-ce que ça a changé ? » et le serveur répond 304 Not Modified sans aucun contenu.

Quels fichiers sont audités

On commence par la page elle-même, après les redirections, puis on prend les fichiers du même domaine enregistré trouvés dans son HTML : jusqu’à quatre feuilles de style, cinq scripts, trois images et deux polices. Les places inutilisées vont aux autres fichiers, pour quinze au total et les polices appelées dans vos feuilles de style s’ajoutent s’il reste de la place. Chaque fichier est demandé comme le ferait un navigateur, en proposant Brotli et gzip, en HTTP/2 quand le serveur le permet.

Les fichiers d’autres domaines, comme Google Fonts ou un script d’analyse, sont laissés de côté. Leurs en-têtes ne sont pas à vous.

Comment chaque colonne est jugée

Compression
Vert quand un fichier texte arrive avec un Content-Encoding. Rouge quand la page, ou un fichier texte de plus de 20 Ko, arrive brut. Orange pour les fichiers bruts plus petits et rien n’est reproché aux fichiers de moins de 1 Ko. Pour chaque fichier brut, l’audit compresse lui-même le contenu en gzip et montre la taille obtenue. Les images et les polices WOFF2 affichent « inutile ».
Cache
La durée vient de max-age, ou de Expires quand il n’y a pas de max-age. Une feuille de style, un script, une image ou une police est signalé quand il n’a aucune durée ou une durée de moins de sept jours. no-store et no-cache comptent pour zéro. La page HTML est donnée à titre indicatif seulement, avec un avertissement si elle peut être conservée plus d’une heure, car les visiteurs qui reviennent risqueraient de voir une version périmée.
Protocole
Réussi avec HTTP/2, qui transporte tous les fichiers en parallèle sur une seule connexion. HTTP/3 est détecté grâce à l’en-tête alt-svc, où un serveur annonce h3.
Économies
Les octets transférés comparés aux octets décompressés, pour l’ensemble de l’échantillon.

Un site qui utilise gzip partout reçoit une remarque sur Brotli, qui réduit les fichiers texte d’environ 15 à 20 % de plus. Voyez-y une amélioration à planifier. Rien ne cloche sans lui.

Le mettre en place sans risque

Quand quelque chose est à corriger, le résultat contient des blocs prêts à l’emploi pour Apache et nginx. Derrière un CDN comme Cloudflare, la compression se fait à la périphérie et les durées de cache se règlent dans le tableau de bord. Sur WordPress, les extensions de cache écrivent ces mêmes règles à votre place.

Pour la durée, une seule règle décide de tout. Un long cache n’est sûr que si l’adresse du fichier change chaque fois que son contenu change. Les outils de build produisent des noms comme app.3f9a1c.js et WordPress ajoute ?ver=6.8. Les fichiers de ce genre peuvent porter :

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

Les fichiers au nom fixe sont mieux à une semaine ou à un mois. Pour le HTML, Cache-Control: no-cache garde une copie et la fait vérifier par le serveur avant chaque utilisation.

Malgré son nom, no-cache veut dire « revalider avant d’utiliser ». La directive qui interdit de garder une copie est no-store et elle a sa place sur les pages contenant des données personnelles.

Pour confirmer un changement depuis un terminal :

curl -sI -H "Accept-Encoding: br, gzip" https://example.com/ | grep -iE "content-encoding|cache-control"

Ce que l’audit laisse de côté

C’est un échantillon de quinze fichiers d’une seule page : un problème qui touche seulement un autre gabarit peut donc passer inaperçu. Il ne propose pas Zstandard. Il lit max-age et ignore s-maxage, qui ne concerne que les caches partagés. Il saute aussi les fichiers que votre propre CDN sert depuis un autre domaine. Chaque fichier est téléchargé jusqu’à 3 Mo.

Questions fréquentes

Comment vérifier si gzip ou Brotli est activé sur mon site web ?

Demandez une page avec un en-tête Accept-Encoding et cherchez Content-Encoding dans la réponse. Cet audit le fait pour la page et ses principaux fichiers et la commande curl ci-dessus le fait pour une seule adresse.

Brotli est-il meilleur que gzip ?

Pour du texte, oui. Les fichiers sont environ 15 à 20 % plus petits et tous les navigateurs actuels l’acceptent en HTTPS. Gzip reste une bonne base et sert de solution de repli pour les clients plus anciens. Les serveurs activent d’ordinaire les deux.

Quel Cache-Control utiliser pour le CSS et le JavaScript ?

Si le nom du fichier ou sa chaîne de requête change à chaque version, public, max-age=31536000, immutable. Si le nom ne change jamais, choisissez une durée plus courte, comme une semaine, sinon vos visiteurs resteront coincés avec l’ancienne version après une mise à jour.

Faut-il compresser les images en gzip ?

Non. Les fichiers JPEG, PNG, WebP et AVIF sont déjà compressés et gzip brûlerait du temps de processeur pour ne presque rien gagner. Le SVG fait exception, puisque c’est du texte qui se compresse très bien.

Pourquoi certains de mes fichiers manquent-ils dans le tableau ?

Nous ne vérifions que les fichiers du même domaine enregistré que la page, quinze au plus. Les fichiers servis depuis un autre domaine et ceux que des scripts chargent plus tard ne font pas partie de l’échantillon.

Ai-je besoin de HTTP/3 ?

HTTP/2 est l’étape qui compte et presque tous les hébergeurs le proposent. HTTP/3 aide surtout sur les connexions mobiles instables et le plus simple pour l’obtenir est un CDN qui l’active par défaut.