什么是优先:ETag或Last-Modified HTTP标头?

时间:2009-05-05 09:55:41

标签: http caching last-modified etag

对于后续两个请求,浏览器会给予以下两个标题中的哪一个更多权重:其中一个更改:ETag还是Last-Modified?

3 个答案:

答案 0 :(得分:88)

根据RFC 2616第13.3.4节,HTTP 1.1客户端必须在任何缓存条件请求中使用ETag,如果同时存在ETag和Last Modified,它应该同时使用两者。除非服务器明确声明弱,否则ETag标头被认为是强验证器(参见第13.3.3节),而Last Modified标头被认为是弱的,除非它与Date标头之间至少存在微小的差异。但请注意,服务器不需要发送(但它应该,如果可以的话)。

请注意,客户端不会检查标头是否已更改;它只是在下一个条件请求中盲目地使用它们;由服务器来评估是发送请求的内容还是304 Not Modified响应。如果服务器只发送一个,那么客户端将单独使用该服务器(尽管只有强验证器对Range请求有用)。当然,它也可以由中间缓存(除非它们已经通过缓存控制指令阻止缓存)和服务器如何对标头进行操作; RFC规定,如果验证器不一致,它们不得返回304 Not Modified,但由于标头值是由服务器生成的,因此它有很大的余地。

在实践中,我注意到Chrome,FireFox和IE 7+都发送了两个标头(如果有)。我还测试了发送修改后的头文件时的行为,我已经从RFC中的信息中怀疑了这一点。我测试的四个客户端只在刷新页面时发送了条件请求,或者是第一次当前进程请求页面时发送了条件请求。

答案 1 :(得分:20)

它不是更像“OR”表达式。在伪代码中:

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

答案 2 :(得分:8)

=!是正确的比较运算符。客户端需要保留从服务器接收的文字字符串,因为转换可能会产生很小的差异。你不能认为'越新越好'。

为什么呢?考虑服务器操作员恢复资源的错误版本的情况。还原版本是OLDER - 但是正确。

客户端必须使用服务器当前提供的版本;它只能在相同的情况下使用缓存版本。因此,服务器必须检查相等性,而不是“更新”。