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