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

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

当我Last-Modified在 Apache 中取消设置标头(ETags也被禁用)时,Firefox(4.01)将不会缓存任何文件不管我是否设置未来的Expires标题或启用Cache-Control标题。

那么浏览器缓存是否需要Last-Modified(和/或)标头?ETag

这里

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

...好吧,如果“新鲜度信息”指的是“Cache-Control”或“Expires”标头,那么 Firefox 应该在没有 Last-Modified 标头的情况下进行缓存。

编辑以获取更多 Firefox 信息

请注意,如果没有标头,则无法在 Firefox 4.01 中由 Apache 2.2 提供服务的任何 PHP 文件上生成 304 的尝试(重新加载、重新访问等)Last-Modified,无论是有效缓存Cache-Control标头、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

编辑更多奇怪的 Firefox 4.01 发现

更奇怪的是,根据我对 Firefox 4.01 的观察,没有任何形式的服务器端缓存控制标头(Expires 和/或 Cache-Control)会影响 Firefox 的缓存行为。Firefox 只关心新鲜度信息(Etag 或 Last-Modified)。

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

如果有人在观察中发现不同,请告知我。

另一项编辑

此链接

13.2.1 服务器指定的过期时间

过期时间不能用于强制用户代理刷新其显示或重新加载资源;其语义仅适用于缓存机制,并且此类机制仅在发起对该资源的新请求时才需要检查资源的过期状态。有关缓存和历史机制之间差异的说明,请参阅第 13.13 节。

答案1

谨慎阅读网络上的随机文章(尽管 Mark Nottingham 的文章通常很明智)。权威来源应该始终来自 RFC。并且根据RFC 2616浏览器应该使用 Expires: 标头缓存文档,其中时间戳是未来的,或者提供其他有效的缓存指令,前提是该文档未在响应 POST 请求时返回。

设置没有最后修改时间的 max-age 是完全有效的 - 并且规范明确解决了这个问题。

当然,您所描述的内容似乎非常不寻常,暗示 FF4.01 永远不会缓存内容 - 我很惊讶它竟然通过了 QC 检查,却有如此明显的遗漏。您能否提供请求和响应的详细信息来证明这一点(例如直播头条)?

答案2

具体需要什么,不同的浏览器会有所不同,但一般来说,我的理论是,如果要正确缓存内容,至少需要一个 Last-Modified&Etag 标头、Expires 是一个加分项,但如果它具有 etag,浏览器通常会优先考虑它。

相关内容