L'en-tête ETag vs expire

j'ai regardé autour mais n'ai pas été en mesure de comprendre 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 est de s'assurer que mes fichiers flash (et d'autres images et ce qui ne sont pas seulement mis à jour quand il ya un changement à ces fichiers.

Je ne veux pas faire quelque chose de spécial comme changer le nom du fichier ou mettre des caractères bizarres sur la fin de la url à faire pas mise en cache.

aussi, est-ce qu'il y a quelque chose que je dois faire programmatiquement de mon côté dans mes scripts PHP pour supporter cela ou est-ce tout Apache?

342
demandé sur Trott 2009-02-01 04:12:03

7 réponses

ils sont légèrement différents - le ETag ne dispose pas d'informations que le client peut utiliser pour déterminer si oui ou non faire une demande pour ce fichier à l'avenir. Si ETag est tout ce qu'il a, il faudra toujours faire une demande. Cependant, lorsque le serveur lit L'ETag à partir de la requête client, le serveur peut alors déterminer s'il doit envoyer le fichier (HTTP 200) ou dire au client d'utiliser sa copie locale (HTTP 304). Un ETag est simplement une somme de contrôle pour un fichier qui sémantiquement change lorsque le contenu du fichier change.

L'en-tête Expires est utilisé par le client (et les proxies/caches) pour déterminer si oui ou non il a même besoin de faire une requête au serveur. Plus vous êtes proche de la date D'expiration, plus il est probable que le client (ou le mandataire) fera une requête HTTP pour ce fichier depuis le serveur.

donc ce que vous voulez vraiment faire est d'utiliser les deux en - têtes- définir L'en-tête Expires à une valeur raisonnable basé sur la fréquence des changements de contenu. Ensuite, configurez les ETags à envoyer de sorte que lorsque les clients envoient une requête au serveur, il soit plus facile de déterminer s'il faut ou non renvoyer le fichier.

une dernière remarque à propos D'ETag - si vous utilisez une configuration de serveur équilibrée avec plusieurs machines exécutant Apache, vous voudrez probablement désactiver la génération D'ETag. Cela est dû au fait que 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 qu'il n'utilise pas D'inodes dans le calcul, mais ensuite vous voulez vous assurer que les horodatages sur les fichiers sont exactement les mêmes, pour vous assurer que le même ETag est généré pour tous les serveurs.

649
répondu Marc Novakowski 2014-09-11 08:46:57

Etag et Last-modified en-têtes validateurs .

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

Expire et Cache-control donnent l'actualisation de l'information .

This signifie qu'ils informent, le navigateur et l'inverse entre les mandataires, jusqu'à quelle heure ou pour combien de temps, ils peuvent garder la page/le fichier à leur cache.

donc la question est habituellement de savoir quel validateur utiliser, etag ou last-modified, et quel rafraîchir en-tête d'information utiliser, expire ou cache-control.

103
répondu john 2014-11-09 14:29:24

Expires et Cache-Control sont "forts de la mise en cache des en-têtes"

Last-Modified et ETag sont "la faiblesse de la mise en cache des en-têtes"

tout d'abord, le navigateur coche Expires/Cache-Control pour déterminer si oui ou non faire une demande au serveur

si vous devez faire une requête, elle enverra Last-Modified/ETag dans la requête HTTP. Si la valeur Etag du document correspond à cela, le serveur enverra un code 304 au lieu de 200, et pas de contenu. Le navigateur chargera le contenu de son cache.

28
répondu hienbt88 2014-03-04 15:45:10

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

vous devriez probablement aussi avoir Apache envoyer un en-tête Expires daté d'un an dans le futur (selon http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) afin que les navigateurs sachent que le contenu est cachable. Regardez mod_expires pour configurer cela.

19
répondu David Z 2009-02-01 01:25:30

un autre résumé:

vous devez utiliser les deux. Les ETags sont une information "côté serveur". Expires est un cache "côté Client".

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

  • expire doit être utilisé avec prudence, comme si vous définissiez une date d'expiration loin dans le futur mais que vous voulez changer un des fichiers immédiatement (un fichier JS par exemple), certains utilisateurs ne pourront pas obtenir la version modifiée avant longtemps!

13
répondu Benjamin Piette 2014-07-17 17:43:16

une autre chose que j'aimerais mentionner, c'est que certaines des réponses ont peut-être manqué l'inconvénient d'avoir à la fois ETags et Expires/Cache-control dans vos en-têtes.

selon vos besoins, il peut simplement ajouter des octets supplémentaires dans vos en-têtes, ce qui peut augmenter les paquets, ce qui signifie plus de TCP overhead. Encore une fois, vous devriez voir si le coût d'avoir les deux choses dans vos headers est nécessaire ou est-ce que cela juste ajouter du poids supplémentaire dans vos demandes qui réduit performance.

vous pouvez lire plus à ce sujet sur cet excellent billet de blog par Kyle Simpson: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1
répondu aneagoie 2016-10-14 19:21:09

à mon avis, avec L'en-tête expirer, 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 chaque demande du client.

1
répondu Sunny 2016-12-22 08:36:52