优先级高的是:ETag或Last-Modified HTTP标头?


82

对于两个后续请求,浏览器应该对以下两个标头中的哪个标头赋予更大的权重:其中一个应更改:ETag或Last-Modified?

Answers:


90

根据RFC 2616第13.3.4节,HTTP 1.1客户端必须在任何缓存条件请求中使用ETag,并且如果同时存在ETag和Last Modified,则应同时使用两者。除非服务器明确将ETag标头声明为弱,否则将ETag标头视为强验证器(请参阅第13.3.3节),而除非最后修饰标头与Date标头之间存在至少一分钟的区别,否则将其视为弱标。但是请注意,服务器也不要求发送任何消息(但如果可以,则应该发送)。

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

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


1
很好的答案,托马斯。感谢您提供官方规范并讨论当前的浏览器实现。
dthrasher

1
从14.26节开始,服务器不得执行请求的方法,除非要求这样做,因为资源的修改日期与请求中If-Modified-Since标头字段中提供的日期不匹配。 看起来If-Modified-Since具有优先权。
Vicary

20

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

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

4
我认为上次修改的时间戳应该进行不同的比较,例如:if ETagFromServer!= ETagOnClient || LastModifiedFromServer> LastModifiedOnClient
RoyM 2014年

这是一个AND语句,因为ETag可能很弱,在这种情况下,您可以拥有一个语义上等效的实体,然后返回最后修改的标头。考虑一下图片可以重新编码的情况,尽管它们不是字节相同的,但我们想说原始图像和重新编码是相同的。在这种情况下,我们要使用最后修改的版本作为后备,这就是为什么它们都必须保持一致的
原因-ParoX

8

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.