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

use*_*442 80 etag caching http last-modified

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

Tho*_*ias 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中的信息中怀疑了这一点.我测试的四个客户端只在刷新页面时发送了条件请求,或者是第一次当前进程请求页面时发送了条件请求.


Gid*_*don 20

它不是更像"OR"表达式.在伪代码中:

if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
   GetFromServer
else
   GetFromCache
Run Code Online (Sandbox Code Playgroud)

  • 我认为最后修改的时间戳应该进行不同的比较,如:ETagFromServer!= ETagOnClient || LastModifiedFromServer> LastModifiedOnClient (4认同)

小智 8

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

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

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