web-dev-qa-db-fra.com

ETag vs Header Expires

J'ai regardé autour de moi, mais je n'ai pas été en mesure de déterminer si je devrais utiliser à la fois un ETag et un Expires Header ou l'un ou l'autre.

Ce que j'essaie de faire, c'est de veiller à ce que mes fichiers flash (ainsi que d'autres images et autres éléments ne soient pas mis à jour uniquement lorsque ces fichiers sont modifiés).

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 qu'il ne soit pas mis en cache.

Aussi, y a-t-il quelque chose que je devrais faire par programme de mon côté dans mes scripts PHP pour supporter cela ou est-ce tout Apache?

347
GeoffreyF67

Ils sont légèrement différents - l'ETag ne dispose d'aucune information que le client peut utiliser pour déterminer s'il convient de demander ou non une nouvelle demande pour ce fichier à l'avenir. Si ETag est tout ce dont il dispose, il devra toujours faire une demande. Toutefois, lorsque le serveur lit l'ETag à partir de la demande du client, il peut alors décider d'envoyer le fichier (HTTP 200) ou d'indiquer au client d'utiliser simplement sa copie locale (HTTP 304). Un ETag est fondamentalement juste 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 a même besoin d'envoyer une requête au serveur. Plus vous êtes proche de la date d'expiration, plus il est probable que le client (ou le proxy) envoie 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 de modification du contenu. Configurez ensuite les étiquettes ETags à envoyer de sorte que, lorsque les clients envoient une demande au serveur, celui-ci puisse déterminer plus facilement si le fichier doit être renvoyé.

Une dernière remarque à propos d'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 d'ETag. En effet, les inodes font partie 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 vous souhaitez ensuite vous assurer que les horodatages des fichiers sont exactement les mêmes afin de garantir que le même fichier ETag est généré pour tous les serveurs.

657
Marc Novakowski

Les en-têtes Etag et Last-modified sont validators .

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

Expires et Cache-control donnent actualisent les informations .

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

La question est donc généralement de savoir quel validateur utiliser, etag ou dernière modification, et quel en-tête de rafraîchissement d’information utiliser, expirer ou contrôler le cache.

103
john

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

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

Tout d’abord, le navigateur vérifie Expires/Cache-Control pour déterminer s’il faut ou non faire une demande au serveur.

Si vous devez faire une demande, il 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 aucun contenu. Le navigateur chargera le contenu de son cache.

28
hienbt88

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 parfaitement suffire pour faire ce que vous voulez. Je pense que cela 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 très bien pour faire ce que vous voulez.

Apache devrait probablement également envoyer un en-tête Expires datant d’un an (selon http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) afin que les savoir que le contenu est en cache. Regardez mod_expires pour le configurer.

19
David Z

Un autre résumé:

Vous devez utiliser les deux. Les ETags sont une information "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 informeront les clients qu’ils doivent obtenir les nouvelles versions de vos fichiers de serveur chaque fois que vous modifiez quelque chose de votre côté.

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

13
Benjamin Piette

Une chose supplémentaire que je voudrais mentionner que certaines des réponses ont peut-être manqué est l'inconvénient d'avoir à la fois ETags et Expires/Cache-control dans vos en-têtes. 

En fonction de vos besoins, il peut simplement ajouter des octets supplémentaires dans vos en-têtes, ce qui peut augmenter le nombre de paquets, ce qui entraîne une surcharge de TCP. Encore une fois, vous devriez voir si le surcoût d’avoir ces deux éléments dans votre en-tête est nécessaire ou si cela alourdira simplement le poids de vos demandes, ce qui réduira les performances.

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

1
aneagoie

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

1
Sunny

ETag est utilisé pour déterminer si une ressource doit utiliser la copie. et Expires Header, comme Cache-Control, informe le client qu’avant la mise en cache, le client doit récupérer la ressource locale.

Dans les sites modernes, il existe souvent un fichier appelé hash, comme app.98a3cf23.js, de sorte qu'il est recommandé d'utiliser Expires Header. En plus de cela, cela réduit également le coût du réseau.

J'espère que ça aide ;)

0
Jack Chen