brunoyang/blog

if-modified-since vs if-none-match

brunoyang opened this issue · 0 comments

if-modified-since 和 if-none-match是两个用来控制缓存的http头。

last-modified/if-modified-since: 这两个字段是一对,秤不离砣。浏览器第一次访问资源时,浏览器会将资源的最后修改时间(last-modified)和资源一起给浏览器。浏览器将这两个的东西都缓存下来后,第二次请求该资源时,会带上if-modified-since字段,字段值是上次缓存下来的last-modified值,服务器对比一下要返回的资源的最后修改时间,若发现是相同的,就会返回304。

if-none-match/etag:这是另外一组用来控制缓存的头。浏览器第一次访问资源时,服务器给该条响应加上etag字段,至于etag的值是什么是随意的,最好是保证唯一性,防止该资源与其他的资源etag重复。一般来说,可以是MD5值,版本号等等。浏览器接收到该资源后,会将etag和资源一起缓存下来。在第二次需要获取这个资源时,会向服务器发起一次请求,请求头里面会有if-none-match字段,字段值就是上次请求到的etag。服务器将if-none-match和本次响应里的etag相比较,若相等,则说明无需修改,直接返回304。

那什么时候使用if-modified-since,什么时候使用if-none-match呢,分情况。

  • 对实时性要求不高的静态资源可以使用if-modified-since;
  • 资源是动态生成,如通过查数据库拼出来的html(数据库自带最后修改时间字段可以用if-modified-since)可以使用etag,因为这时候该文件的last-modified值永远是文件生成时间,缓存就无从谈起了。