53 votes

mise en cache du navigateur - expires ou max-age, last-modified ou etag

J'ai du mal à trouver une explication claire et pratique sur la manière correcte de tirer parti de la mise en cache du navigateur pour augmenter la vitesse des pages.

Selon ce site :

Il est important de préciser l'une des options suivantes : Expires ou Cache-Control max-age, et l'un des éléments suivants : Last-Modified ou ETag, pour toutes les ressources pouvant être mises en cache. Il est redondant de préciser à la fois Expires et Cache-Control : max-age, ou de préciser à la fois spécifier à la fois Last-Modified et ETag.

Est-ce correct ? Si oui, dois-je utiliser Expires o max-age ? Je pense avoir une idée générale de ce que sont ces deux éléments, mais je ne sais pas lequel est le mieux à utiliser.

Si je dois aussi faire Last-Modified o ETag lequel des deux ? Je pense que j'ai Last-Modified mais je suis encore très confus à ce sujet ETag concept.

Par ailleurs, pour quels fichiers dois-je activer la mise en cache du navigateur ?

72voto

Yvan Points 547

Est-ce correct ?

Oui, Expires et max-age font la même chose, mais de deux manières différentes. Même chose pour Last-Modified et Etag.

Si oui, dois-je faire expires ou max-age ?

Expires dépend de la précision de l'horloge de l'utilisateur, c'est donc un mauvais choix (la plupart des navigateurs supportent HTTP/1.1). Utilisez max-age, pour indiquer au navigateur que le fichier est valable pendant ce nombre de secondes. Par exemple, un cache d'un jour serait :

Cache-Control : max-age=86400

Notez que lorsque les deux Cache-Control y Expires sont présents, Cache-Control a la priorité. lire

Si je dois également indiquer Last-Modified ou ETag, lequel des deux ? Je pense que je dois faire Last-Modified

Vous avez raison, Last-Modified devrait être mieux. Bien qu'il s'agisse d'une heure, elle est envoyée par le serveur. Il n'y a donc pas de problème avec l'horloge de l'utilisateur. C'est la raison pour laquelle Last-Modified est meilleur que Expires. Le navigateur envoie le Last-Modified que le serveur a envoyé la dernière fois qu'il a demandé le fichier, et si c'est le même, le serveur répond avec une réponse vide "304 Not Modified".

Il faut également noter que l'ETag peut également être utile, car le paramètre Last-Modified a une fenêtre temporelle d'une seconde. Vous ne pouvez donc pas distinguer deux sources différentes avec la même valeur Last-Modified. [2]

Etag nécessite un peu plus de calcul que Last-Modified, car il s'agit d'une signature de l'état actuel du fichier (similaire à une somme md5 ou un CRC32).

Par ailleurs, pour quels fichiers dois-je activer la mise en cache du navigateur ?

Tous les fichiers peuvent bénéficier de la mise en cache. Vous avez deux approches différentes :

  • avec max-age : utile pour les fichiers qui ne changent jamais (images, CSS, javascript). Tant que la valeur max-age est respectée, le navigateur n'envoie aucune requête au serveur. Vous verrez donc la page se charger très rapidement lors du deuxième chargement. Si vous devez mettre à jour des fichiers, ajoutez simplement un point d'interrogation, et la date de modification (par exemple /image.png?20110602, ou pour une meilleure mise en cache par proxy, quelque chose comme /20110602/image.png ou /image.20110602.png). De cette façon, vous pouvez faire en sorte que les fichiers expirent s'ils sont urgents (rappelez-vous que le navigateur ne frappe presque jamais le serveur une fois qu'il a un fichier d'âge maximum). L'utilisation principale est d'accélérer les choses et de limiter les demandes envoyées au serveur.
  • avec Last-Modified : peut être défini sur tous les fichiers (y compris ceux avec max-age). Même si vous avez des pages dynamiques, il se peut que vous ne changiez pas le contenu du fichier pendant un certain temps (même si c'est 10 min), donc cela peut être utile. L'utilisation principale ici est de dire au navigateur "continuez à me demander ce fichier, s'il est nouveau, je vous enverrai le nouveau". Il y a donc une demande envoyée à chaque chargement de page, mais la réponse est vide si le fichier est déjà bon (304 Not Modified), ce qui permet d'économiser de la bande passante.

Plus vous utilisez la mémoire cache, plus vos pages s'afficheront rapidement. Mais comme il est difficile de vider les caches, il faut faire preuve de prudence.

Un bon endroit pour apprendre tout cela avec de nombreuses explications : http://www.mnot.net/cache_docs/

[2] : rfc7232 Etag https://www.rfc-editor.org/rfc/rfc7232#section-2.3

0 votes

Merci d'avoir fourni cette explication. Cependant, j'ai encore du mal à comprendre comment mettre en œuvre vos suggestions pour max-age et last-modified. Où puis-je trouver des exemples du code réel que je devrais mettre dans mon htaccess pour ces éléments ? Dois-je lister chaque image ? Je pense avoir compris le concept, mais j'ai besoin d'une aide un peu plus explicite sur ce à quoi cela ressemblerait dans le htaccess.

1 votes

Voir les exemples dans le manuel d'Apache : httpd.apache.org/docs/2.3/fr/mod/mod_expires.html (expiration du module). Par exemple : ExpiresByType image/gif M604800 fera expirer les images GIF après 7 jours (7*86400) après leur propre temps de modification. Vous trouverez de nombreux autres exemples sur la même page. Last-Modified peut aussi être envoyé, mais je n'utilise pas Apache, donc je ne l'ai pas testé.

1 votes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X