浏览器caching是否需要Last-Modified HTTP标头?

当我在Apache中取消设置Last-Modified标头时( ETags也被禁用),Firefox(4.01)将不会caching任何文件,无论设置将来的Expires头还是启用Cache-Control头。

那么浏览器caching需要Last-Modified (和/或ETag )头文件吗?

从这里 :

如果响应中没有validation者(ETag或Last-Modified头),并且没有任何明确的新鲜度信息,则将被视为不可caching。

如果按照“新鲜度信息”的意思是“caching控制”或“过期”标题,Firefox应该被caching而没有Last-Modified标题。

编辑进一步的FIREFOX信息

请注意,不pipe是否设置了有效的高速cachingCache-Control ,都不会在没有Last-Modified标头的情况下尝试在Firefox 4.01的Apache 2.2服务的任何PHP文件上生成304(重新加载,新访问等)头, Expires头或两个头。

foo.php :这个文件的内容只是回应'Hello World'。

 HTTP/1.1 200 OK Date: Mon, 06 Jun 2011 14:04:58 GMT Server: Apache Cache-Control: public, max-age=3600 Expires: Fri, 01 Jul 2011 21:23:55 GMT Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 1594 Keep-Alive: timeout=10, max=500 Connection: Keep-Alive Content-Type: text/html; charset=utf-8 

编辑甚至更奇怪的火狐4.01的结果

更奇怪的是,根据我在Firefox 4.01中看到的,任何forms的服务器端caching控制头(Expires和/或Cache-Control)都不会影响Firefox的caching行为。 Firefox只关心新鲜度信息(Etag或Last-Modified)。

总之,如果文件已被修改,Firefox将重新加载它,而不pipe任何Expires或Cache-Control标头。 如果文件不包含任何新鲜度信息,Firefox无论如何都会重新加载。

如果有人发现他们的观察结果有所不同,请更新我。

另一个编辑

从这个链接 :

13.2.1服务器指定的到期

过期时间不能用来强制用户代理刷新其显示或重新加载资源; 它的语义只适用于caching机制,并且这种机制只需要在资源的新请求被启动时检查资源的到期状态。 有关高速caching和历史机制之间差异的解释,请参见13.13节。

小心阅读网上的随机文章(虽然马克诺丁汉的东西通常是明智的)。 最终的来源应该始终由RFC。 根据RFC 2616的规定,浏览器应该caching一个带有Expires:头文件的时间戳,或者提供其他有效的caching指令的文件,只要该文件不是响应POST请求而返回的。

在没有最后修改的情况下设置最大年龄是完全有效的,并且规范明确地解决了这个问题。

当然,你所描述的看起来很不寻常,暗示着FF4.01将永远不会caching内容 – 我会惊讶于它通过了​​这样一个明显的遗漏QC检查。 你能否提供certificate这一点的要求和回应的详细信息(例如,与liveheaders )?

它在不同浏览器之间有所不同,但是一般来说,我使用的理论是,如果内容将被正确caching,它至less需要一个Last-Modified Etag头,Expires是一个加号,但如果它有一个etag浏览器通常会优先于其他任何东西。