对于两个后续请求,浏览器应该对以下两个标头中的哪个标头赋予更大的权重:其中一个应更改:ETag或Last-Modified?
Answers:
根据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中的信息中怀疑了该标头。我测试的四个客户端仅在刷新页面或当前进程第一次请求页面时才发送条件请求。
它不是更像“ OR”表达式。用伪代码:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
GetFromServer
else
GetFromCache