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

时间:2015-02-01 12:40:35

标签: php html http caching web

Chrome仍然会从缓存中加载文件,尽管“ETag”已更改,并且“Last-Modified”设置为比服务器缓存的资源更新的日期。为什么???

1 个答案:

答案 0 :(得分:0)

最好始终在Cache-Control中设置Expires或max-age。如果未指定资源何时到期,则允许浏览器使用自己的启发式进行缓存。请参阅13.2.4 of RFC 2616部分:

  

如果没有Expires,Cache-Control:max-age或Cache-Control:s-   maxage(参见第14.9.3节)出现在响应和响应中   不包括缓存的其他限制,缓存可以计算   使用启发式的新鲜度。缓存必须附加警告   113如果发出此类警告,年龄超过24小时的任何回复   尚未添加。

     

此外,如果响应确实具有Last-Modified时间,则启发式   到期值应该不超过间隔的某个部分   自那时以来。此分数的典型设置可能是10%。

     

确定响应是否已过期的计算是完全正确的   简单:

  response_is_fresh = (freshness_lifetime > current_age)

Chrome已缓存资源,因为您尚未指出是否应缓存该资源。只有在浏览器确定资源可能过时后,浏览器才会使用Last-Modified来验证资源。

您需要设置Expires或Cache-Control以获得所需的缓存行为。

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

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