ETag vs Header expire

359

J'ai regardé autour de moi, mais je n'ai pas réussi à savoir si je devrais utiliser à la fois un ETag et un en-tête Expires ou l' un ou l'autre.

Ce que j'essaie de faire, c'est de m'assurer que mes fichiers flash (et les autres images et non seulement sont mis à jour en cas de modification de ces fichiers.

Je ne veux rien faire de spécial comme changer le nom de fichier ou mettre des caractères étranges à la fin de l'URL pour ne pas le mettre en cache.

De plus, y a-t-il quelque chose que je dois faire par programmation de mon côté dans mes scripts PHP pour le supporter ou est-ce tout Apache?

GeoffreyF67
la source
1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (bon en général)
Christophe Roussy

Réponses:

677

Ils sont légèrement différents - l'ETag ne dispose d'aucune information que le client peut utiliser pour déterminer s'il doit ou non faire une nouvelle demande pour ce fichier à l'avenir. Si ETag est tout ce qu'il a, il devra toujours faire une demande. Cependant, lorsque le serveur lit l'ETag à partir de la demande du client, le serveur peut alors déterminer s'il faut envoyer le fichier (HTTP 200) ou dire au client d'utiliser simplement leur copie locale (HTTP 304). Un ETag est simplement une somme de contrôle pour un fichier qui change sémantiquement lorsque le contenu du fichier change.

L'en-tête Expires est utilisé par le client (et les mandataires / caches) pour déterminer s'il doit ou non même faire une demande au serveur. Plus vous êtes proche de la date d'expiration, plus il est probable que le client (ou proxy) fera une demande HTTP pour ce fichier à partir du serveur.

Donc, ce que vous voulez vraiment faire, c'est utiliser les DEUX en-têtes - définissez l'en-tête Expires sur une valeur raisonnable en fonction de la fréquence à laquelle le contenu change. Configurez ensuite les ETags à envoyer de sorte que lorsque les clients envoient une demande au serveur, il puisse plus facilement déterminer s'il faut renvoyer ou non le fichier.

Une dernière remarque sur ETag - si vous utilisez une configuration de serveur à charge équilibrée avec plusieurs machines exécutant Apache, vous souhaiterez probablement désactiver la génération ETag. En effet, les inodes sont utilisés dans le cadre de l'algorithme de hachage ETag qui sera différent entre les serveurs. Vous pouvez configurer Apache pour ne pas utiliser les inodes dans le cadre du calcul, mais vous devez vous assurer que les horodatages des fichiers sont exactement les mêmes, pour garantir que le même ETag soit généré pour tous les serveurs.

Marc Novakowski
la source
12
Vous devez également vérifier si vous devez utiliser Cache-Control au lieu de Expires. Ma compréhension est que Cache-Control a été introduit après expiration et vous donne plus de contrôle. Voir stackoverflow.com/questions/5799906/…
Luis Perez
6
Lorsque vous utilisez l'en-tête Expires, il est recommandé de modifier le nom du fichier chaque fois qu'une ressource change, car le client ne demandera plus le fichier avant qu'il ne soit périmé. Surtout si vous utilisez des valeurs très lointaines comme date d'expiration.
schnatterer
8
Disons que nous utiliserons les deux. Que se passe-t-il lorsque le délai d'expiration a expiré, mais que le fichier n'est pas modifié (l'Etag est le même)? Le serveur renverra 304 et le fichier sera servi à partir du cache du navigateur. Ma question est, sera régénéré l'heure d'expiration en ce moment?
user345602
2
Soyez prudent en définissant ETAG et l'en-tête Expires sur une valeur non nulle. Cela peut conduire à des conditions de course. Voir jakearchibald.com/2016/caching-best-practices
Weston
2
Est-il possible de dire aux serveurs de ne pas utiliser du tout d'inodes ou d'horodatages? En outre, pourquoi sont-ils nécessaires pour les ETags, s'ils sont utilisés pour représenter uniquement du contenu?
Cesar Castro
108

Etag - têtes et Last-modified sont des validateurs .

Ils aident le navigateur et / ou le cache (proxy inverse) à comprendre si un fichier / page a changé, même s'il conserve le même nom.

Expire et Cache-control donnent des informations de rafraîchissement .

Cela signifie qu'ils informent, le navigateur et les procurations inverses intermédiaires, jusqu'à quelle heure ou pendant combien de temps, ils peuvent conserver la page / le fichier dans leur cache.

Ainsi, la question est généralement de savoir quel validateur utiliser, etag ou dernière modification, et qui actualise l'en-tête des informations à utiliser, expire ou contrôle du cache.

John
la source
31

Expireset Cache-Controlsont des "en-têtes de mise en cache forts"

Last-Modifiedet ETagsont des "en-têtes de mise en cache faibles"

D'abord, le navigateur vérifie Expires/Cache-Controls'il faut ou non faire une demande au serveur

Si vous devez faire une demande, il enverra Last-Modified/ETagla demande HTTP. Si la Etagvaleur du document correspond à cela, le serveur enverra un code 304 au lieu de 200 et aucun contenu. Le navigateur chargera le contenu de son cache.

hienbt88
la source
1
trouvez-vous qu'un document prend en charge le comportement de mise en cache "fort et faible"? Je n'ai pas pu en trouver, et mon navigateur client priorise désormais la dernière modification sur expire en fait, ce que je ne comprends pas pourquoi.
GMsoF
1
@GMsoF Vous voudrez peut-être jeter un œil à ceci: tools.ietf.org/html/rfc7232#section-2.1
Medeiros
Donc, si je veux m'assurer que mes modifications sont immédiatement propagées au client, tout en bénéficiant d'une mise en cache, je ne peux utiliser que Last-Modified et ETag, n'est-ce pas?
Sébastien Lorber
C'est la réponse la plus concise et pourtant la plus claire pour moi! Merci.
aderchox
18

Par défaut, Apache générera un Etag basé sur le numéro d'inode du fichier, la date de dernière modification et la taille, ce qui devrait être parfaitement adapté pour faire ce que vous voulez. Je pense qu'il générera également par défaut un en-tête Last-Modified basé sur la dernière heure de modification du fichier sur le disque, ce qui est également parfaitement adapté pour faire ce que vous voulez.

Vous devriez probablement aussi demander à Apache d'envoyer un en-tête Expires daté d'un an à l'avenir (selon http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) afin que les navigateurs sachent que le contenu est cacheable. Jetez un œil à mod_expires pour configurer cela.

David Z
la source
Ainsi, l'ETag aura la dernière modification et l'en-tête expirera lui dira que je veux qu'il soit mis en cache et lorsque je téléchargerai et écraserai mon fichier, il sera simplement redirigé vers le cache de l'utilisateur, sinon un 304 serait généré, n'est-ce pas?
GeoffreyF67
L'Etag dépend de manière compliquée de la date de dernière modification; mais lorsque vous modifiez le fichier, l'Etag change. Ensuite, l'Etag envoyé par le navigateur (pour sa version en cache du fichier) ne correspondra pas à l'Etag du fichier sur le serveur, et Apache enverra le fichier plutôt qu'une réponse 304.
David Z
6
L'en-tête d'expiration d'un an ne dira-t-il pas au client de ne même pas rechercher une nouvelle version pendant un an?
John Bachir
@John: oui, je pense que je pensais à du contenu statique qui ne change jamais quand j'ai écrit ça.
David Z
2
@John Bachir: cela devrait être le cas, mais le navigateur semble de toute façon frapper le serveur pour demander une version plus récente. J'ai ouvert une autre question à propos de ce problème: stackoverflow.com/questions/10048740/…
Marco Demaio
13

Un autre résumé:

Vous devez utiliser les deux. Les ETags sont des informations "côté serveur". Les expirations sont une mise en cache "côté client".

  • Utilisez ETags sauf si vous avez un serveur à charge équilibrée. Ils sont sûrs et permettront aux clients de savoir qu'ils doivent obtenir de nouvelles versions de vos fichiers serveur chaque fois que vous modifiez quelque chose de votre côté.

  • Expires doit être utilisé avec prudence, comme si vous définissez une date d'expiration dans le futur mais que vous souhaitez modifier l'un des fichiers immédiatement (un fichier JS par exemple), certains utilisateurs peuvent ne pas obtenir la version modifiée avant longtemps!

Benjamin Piette
la source
2
Dans le cas de cette situation Expires, vous devez essentiellement renommer votre js et le changer dans votre HTML, et espérons que vous n'avez pas défini l'expiration du fichier HTML 1 an également.
EralpB
1

Une autre chose que je voudrais mentionner que certaines des réponses peuvent avoir manqué est l'inconvénient d'avoir les deux ETagset Expires/Cache-controldans vos en-têtes.

Selon vos besoins, cela peut simplement ajouter des octets supplémentaires dans vos en-têtes, ce qui peut augmenter les paquets, ce qui signifie plus de surcharge TCP. Encore une fois, vous devriez voir si le surcoût d'avoir les deux choses dans vos en-têtes est nécessaire ou cela ajoutera-t-il simplement un poids supplémentaire à vos demandes, ce qui réduit les performances.

Vous pouvez en lire plus sur cet excellent article de blog de Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

aneagoie
la source
1

À mon avis, avec Expire Header, le serveur peut dire au client quand mes données seraient périmées, tandis qu'avec Etag, le serveur vérifierait la valeur etag pour le client à chaque demande.

Ensoleillé
la source
0

ETag est utilisé pour déterminer si une ressource doit utiliser la copie. et Expires Header comme Cache-Control est informé au client qu'avant les décennies de cache, le client doit récupérer la ressource locale.

Dans les sites modernes, il existe souvent un fichier nommé hash, comme app.98a3cf23.js, de sorte que c'est une bonne pratique d'utiliser l'en-tête Expires. En plus de cela, cela réduit également le coût du réseau.

J'espère que cela aide ;)

Jack Chen
la source