84 votes

Qu'est-ce qui prime: l'en-tête ETag ou Last-Modified HTTP?

Pour les deux demandes suivantes, lequel des deux en-têtes suivants reçoit le plus de poids de la part des navigateurs si l'un d'entre eux devait changer: ETag ou Last-Modified?

94voto

Thomas S. Trias Points 673

Selon la RFC 2616 l'article 13.3.4, HTTP 1.1 Client DOIT utiliser l'ETag dans tous les cache-requêtes conditionnelles, et si les deux d'en-tête ETag et de Dernière modification, il DOIT utiliser les deux. L'en-tête ETag est considérée comme un solide programme de validation (voir la section 13.3.3), sauf s'il est explicitement déclaré faible par le serveur, tandis que la Dernière modification de l'en-tête est considérée comme faible, sauf si au moins une minute de différence existe entre elle et la Date de l'en-tête. Notez, cependant, que le Serveur n'est pas nécessaire d'envoyer soit (mais il DEVRAIT, si elle le peut).

Notez que le Client ne vérifie pas les en-têtes pour voir si elles ont changé, il a juste aveuglément les utilise dans la prochaine requête conditionnelle; c'est le Serveur d'évaluer s'il convient d'envoyer le contenu demandé ou une réponse " 304 not Modified. Si le Serveur n'envoie un, alors le Client va utiliser qu'un seul (bien que, seule une forte validateurs sont utiles pour une Plage de la demande). Bien sûr, il est également à la discrétion de caches intermédiaires (sauf s'ils ont été empêchés de mise en cache via le Cache de directives de Contrôle) et le Serveur de la façon dont ils vont agir sur les en-têtes; la RFC états qu'ils ne DOIVENT PAS retourner un "304 not Modified" si les validateurs sont inconsisent, mais puisque les valeurs d'en-tête sont générés par le serveur, il a un peu de marge de manœuvre.

Dans la pratique, j'ai remarqué que google Chrome, FireFox et IE 7+ tous les envoyer tous les deux en-têtes, si disponible. J'ai aussi testé le comportement lors de l'envoi modifié en-têtes, que j'avais déjà soupçonné de l'information dans la RFC. Les quatre clients, j'ai testé seulement envoyé des requêtes conditionnelles si la ou les page(s) ont été actualisés ou si c'était la première fois que la page avait été demandé par le processus courant.

21voto

Gidon Points 8758

N'est-ce pas plutôt comme une expression "OU"? En pseudo code:

 if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X