((Eak)ETags and Last-Modified

问题描述 投票:18回答:1

据我了解规范,在RFC 2616(HTTP / 1.1)中引入的ETag是Last-Modified-Header的(某种)后继版本,旨在为软件体系结构提供更多控制权通过缓存重新验证过程。

如果同时存在两个缓存验证标头(If-None-Match和If-Modified-Since),则根据RFC 2616,客户端(即浏览器)在检查资源是否已更改时应使用ETag。根据RFC 2616的14.26节,如果If-None-Match-Header中显示的ETag已更改,并且服务器必须忽略其他If-Modified-Since-Header,则服务器不得以304 Not Modified进行响应。 (如果存在)。如果显示的ETag匹配,则他不得执行请求,除非Last-Modified-Header中的Date如此。 (如果显示的ETag匹配,则在GET-或HEAD-请求的情况下,服务器应响应304 Not Modified。)

此部分为一些推测留有余地:

  • 强大的ETag应该“每次”更改,资源也会更改。因此,必须用其他响应(如304 Not Modified)响应具有不变的ETag和If-Modified-Since-Header(不匹配)的请求,这有点矛盾,因为强ETag表示资源是没有修改。 (不过,这并不是致命的,因为服务器可以再次发送相同的不变资源。)
  • ...

...好吧当我写这篇文章的时候,这个问题逐渐归结为这个答案:

上述(小的)矛盾是由于ETag弱而造成的。标有弱ETag的资源可能已更改,尽管ETag并未更改。因此,如果ETag弱,则当ETag尚未更改但If-Modified-Since中显示的日期不匹配时,用304 Not Modified回答是错误的,对吧?

http last-modified etag if-modified-since
1个回答
19
投票

常规(强)ETag与弱ETag之间的区别在于,匹配的强ETag保证文件字节对字节相同,而匹配的弱ETag表示内容在语义上相同。因此,如果文件内容更改,则弱ETag也应更改。

在您呈现的情况下,服务器上的文件可能比客户端中的缓存副本新-但由于ETag匹配,因此从语义上讲等效于缓存副本,因此可以返回304响应。

© www.soinside.com 2019 - 2024. All rights reserved.