对于两个后续请求,如果其中一个发生更改,浏览器会将以下两个标头中的哪一个赋予更大的权重: ETag或Last-Modified?
发布于 2009-10-13 13:01:16
根据RFC 2616的13.3.4节,HTTP1.1客户端必须在任何缓存条件请求中使用ETag,如果ETag和Last Modified都存在,它应该同时使用这两个are。ETag报头被认为是强验证器(参见13.3.3节),除非被服务器明确声明为弱,而Last Modified报头被认为是弱的,除非它与Date报头之间存在至少一分钟的差异。但是,请注意,服务器也不需要发送(但如果可以,它应该发送)。
请注意,客户端不会检查标头以查看它们是否已更改;它只是在下一个条件请求中盲目地使用它们;它由服务器来评估是发送请求的内容还是304未修改的响应。如果服务器只发送一个验证器,那么客户端将单独使用该验证器(尽管,只有强大的验证器才能用于范围请求)。当然,它也取决于中间缓存(除非通过缓存控制指令阻止它们缓存)和服务器如何作用于标头;RFC规定,如果验证器不被接受,它们不能返回304 NOT Modified,但由于标头值是由服务器生成的,所以它有相当大的回旋余地。
在实践中,我注意到Chrome、FireFox和IE 7+都会发送这两个头文件。我还测试了发送修改过的报头时的行为,我已经从RFC中的信息中怀疑到了这一点。我测试的四个客户端仅在刷新页面或当前进程首次请求页面时才发送条件请求。
发布于 2009-05-05 10:12:13
它是不是更像一个"OR“表达式。在伪代码中:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
GetFromServer
else
GetFromCache发布于 2014-11-14 20:48:09
=!是正确的比较运算符。客户端需要保留从服务器接收的文字字符串,因为转换可能会产生很小的差异。你不能假设“越新越好”。
为什么?考虑服务器操作员恢复资源的坏版本的情况。恢复的版本是旧的-但正确。
客户端必须使用服务器当前提供的版本;只有在缓存版本相同的情况下,它才能使用该版本。因此,服务器必须检查相等性,而不是“更新”。
https://stackoverflow.com/questions/824152
复制相似问题