什么优先:ETag或最后修改的HTTP头?
对于后面的两个请求,下面两个头中的哪一个被浏览器赋予了更多的权重,如果其中一个改变了:ETag或Last-Modified?
根据RFC 2616第13.3.4节的规定,HTTP 1.1客户端必须在任何caching有条件的请求中使用ETag,如果ETag和Last Modified都存在,它应该同时使用两者。 ETag头被认为是一个强有力的validation器(见13.3.3节),除非服务器明确声明弱,而最后修改头被认为是弱的,除非它和Date头之间至less存在一个微小的差别。 但请注意,服务器不需要发送(但它应该,如果可以的话)。
请注意,客户端不检查标题以查看是否已更改; 它只是在下一个有条件的请求中盲目地使用它们; 由服务器决定是否发送请求的内容或304 Not Modified响应。 如果服务器只发送一个,那么客户端将单独使用该服务器(尽pipe只有强有力的validation器对于范围请求是有用的)。 当然,也可以由中间caching(除非已经通过caching控制指令禁止caching)和服务器决定如何处理标题; RFC规定,如果validation器不一致,它们绝不能返回304 Not Modified,但是由于头部值是由服务器生成的,所以它有很大的余地。
实际上,我注意到Chrome,FireFox和IE 7+都会发送两个头文件(如果有的话)。 我也testing了发送修改头文件时的行为,我已经从RFC中的信息中猜到了这一点。 我testing的四个客户端只有在页面被刷新时才发送条件请求,或者是当前进程第一次请求页面。
它不是更像是一个“或”的expression。 在伪代码中:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient GetFromServer else GetFromCache
=! 是正确的比较运算符。 客户端需要保留从服务器接收到的string,因为转换可能会造成很小的差异。 你不能认为“更新更好”。
为什么? 考虑服务器操作员还原资源的错误版本的情况。 恢复的版本是旧的 – 但是正确的。
客户端必须使用服务器当前提供的版本; 只有在相同的情况下才能使用caching版本。 因此,服务器必须检查平等,而不是“更新”。