没有“过期”和“缓存控制”标头集,但“上次修改”或“ETag”被忽略,为什么


No "Expires" and no "Cache-Control" header set, yet "Last-Modified" or "ETag" are being ignored, why?

Chrome 仍然从缓存中加载文件,尽管"ETag"发生了变化,并且服务器将"上次修改时间"设置为比缓存资源更新的日期。为什么??

最好

始终在缓存控制中设置过期或最大期限。如果未指定资源过期的时间,则允许浏览器使用自己的启发式缓存。请参阅 RFC 2616 的第 13.2.4 节:

如果未过期,则缓存控制:最大年龄或缓存控制:s- maxage(参见第 14.9.3 节)出现在响应中,并且响应 不包括对缓存的其他限制,缓存可以计算 使用启发式的新鲜度生命周期。缓存必须附加警告 113 对于年龄超过 24 小时的任何响应(如果此类警告) 尚未添加。

此外,如果响应确实具有上次修改时间,则启发式 到期值不应超过间隔的某个部分 从那时起。此分数的典型设置可能是 10%。

确定响应是否已过期的计算非常 简单:

  response_is_fresh = (freshness_lifetime > current_age)

Chrome 缓存了资源,因为您尚未指明是否应缓存该资源。 "上次修改时间"仅在浏览器确定资源可能已过时后由浏览器用于验证资源。

您需要设置"过期"或"缓存控制"才能获得所需的缓存行为。

顺便说一句,对于大多数网站来说,一个好的经验法则是立即使HTML过期,但永远缓存图像,CSS和JavaScript:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/