ETag vs Header Expires

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

Ce que je tente de faire, c’est de m’assurer que mes fichiers Flash (et les autres images et ce qui ne sont pas seulement mis à jour en cas de modification de ces fichiers).

Je ne veux pas faire quelque chose de spécial comme changer le nom du fichier ou mettre des caractères bizarres à la fin de l’URL pour l’empêcher d’être mis en cache.

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

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 ou non de demander à nouveau ce fichier ultérieurement. 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écider d’envoyer le fichier (HTTP 200) ou demander au client d’utiliser sa copie locale (HTTP 304). Un ETag est simplement une sum de contrôle pour un fichier qui change de manière sémantique lorsque le contenu du fichier change.

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

Donc, ce que vous voulez vraiment faire, c’est utiliser les en-têtes BOTH – définissez l’en-tête Expires sur une valeur raisonnable en fonction de la fréquence de modification du contenu. Configurez ensuite les ETags à envoyer pour que, lorsque les clients envoient une requête au serveur, il soit plus facile de déterminer s’il convient ou non de renvoyer le fichier.

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 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 voulez vous assurer que les horodatages sur les fichiers sont exactement les mêmes, pour garantir que le même ETag est généré pour tous les serveurs.

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

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

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

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

Donc, la question est généralement de savoir quel validateur utiliser, etag ou last-modified, et quel en-tête d’actualisation d’actualisation à utiliser, expire ou contrôle de cache.

Expires et Cache-Control sont des “en-têtes de mise en cache puissants”

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

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.

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 parfait 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 parfait pour faire ce que vous voulez.

Vous devriez probablement aussi qu’Apache envoie 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 connaissent le contenu. cacheable. Regardez mod_expires pour le configurer.

Un autre résumé:

Vous devez utiliser les deux. Les ETags sont une information “côté serveur”. Expires sont une mise en cache “côté client”.

  • Utilisez les 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 de serveur chaque fois que vous changez quelque chose de votre côté.

  • Les expirations doivent être utilisées avec précaution, car 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 risquent de ne pas obtenir la version modifiée avant longtemps!

Une autre chose que je voudrais mentionner, à savoir que certaines des réponses peuvent avoir été manquées, est l’inconvénient d’avoir à la fois les ETags et ETags Expires/Cache-control dans vos en-têtes.

En fonction de vos besoins, il peut simplement append des octets supplémentaires dans vos en-têtes, ce qui peut augmenter les paquets, ce qui signifie plus de charge TCP. Encore une fois, vous devriez voir si la nécessité d’avoir les deux choses dans vos en-têtes est nécessaire ou cela appenda-t-il simplement du poids supplémentaire dans vos requêtes, ce qui réduit les performances.

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

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