哪个优先:ETag 或 Last-Modified HTTP 标头?

问题描述 投票:0回答:3

对于两个后续请求,如果其中一个发生更改,浏览器会给予以下两个标头中哪一个更高的权重:ETag 或 Last-Modified?

http caching last-modified etag
3个回答
96
投票

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

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

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


21
投票

这不是更像一个“OR”表达式吗?伪代码:

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

9
投票

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

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

客户端必须使用服务器当前提供的版本;仅当缓存版本相同时才可以使用缓存版本。因此服务器必须检查相等性,而不是“较新”。

© www.soinside.com 2019 - 2024. All rights reserved.