Question

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 en-tête Expires ou , l'un ou l'autre.

Ce que j'essaie de faire, c'est de veiller à ce que mes fichiers flash (ainsi que les 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.

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

Était-ce utile?

La solution

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 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 doit ou non effectuer une requête auprès du 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.

Vous voulez donc vraiment 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 ETags à envoyer de sorte que, lorsque les clients envoient une demande au serveur, celui-ci puisse plus facilement 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 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 ETag soit généré pour tous les serveurs.

Autres conseils

Les en-têtes

Etag et Dernière modification sont des validateurs .

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

Expires et Contrôle de cache fournissent des informations d'actualisation .

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 d’information actualiser à utiliser, expire ou contrôle de cache.

Expires et Cache-Control sont & "En-têtes de cache puissants &";

Last-Modified et ETag sont & "; les 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 demande HTTP. Si la Etag valeur 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ère un Etag basé sur . le numéro d'inode du fichier, sa date de dernière modification et sa taille, ce qui devrait parfaitement vous permettre de 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 navigateurs sachent que le contenu peut être mis en cache. Consultez mod_expires pour le configurer.

Un autre résumé:

Vous devez utiliser les deux. Les ETags sont un & Quot; côté serveur & Quot; information. Les expirations sont un & Quot; Côté client & Quot; la mise en cache.

  • Utilisez ETags sauf si vous avez un serveur dont la charge est équilibrée. Ils sont sûrs et indiqueront aux 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 précaution, car si vous définissez une date d'expiration dans le futur mais souhaitez modifier l'un des fichiers immédiatement (un fichier JS par exemple), certains utilisateurs peut ne pas obtenir la version modifiée avant longtemps!

Une autre chose que je voudrais mentionner est que l’une des réponses manquées est peut-être l’inconvénient d’avoir à la fois ETags et Expires/Cache-control dans votre en-tête.

En fonction de vos besoins, il peut suffire d'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 lié à la présence des deux éléments dans votre en-tête est nécessaire ou s’il ajoute simplement un poids supplémentaire dans vos demandes, ce qui réduit les performances.

Vous pouvez en lire davantage sur cet excellent billet 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 quand mes données seront périmées, alors qu'avec Etag, le serveur vérifierait la valeur etag du client "à chaque demande.

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 est souvent proposé d’offrir un fichier nommé hash, comme app.98a3cf23.js, de sorte qu’il est recommandé d’utiliser Expires Header. En outre, cela réduit également le coût du réseau.

J'espère que ça aide;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top