当我取消设置Last-Modified在Apache的头(ETags也被禁止),火狐(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
Run Code Online (Sandbox Code Playgroud)
编辑更奇怪的 Firefox 4.01 发现
更奇怪的是,根据我在 Firefox 4.01 中看到的情况,没有任何形式的服务器端缓存控制标头(Expires 和/或 Cache-Control)会影响 Firefox 的缓存行为。Firefox 只关心新鲜度信息(Etag 或 Last-Modified)。
总之,如果文件已被修改,Firefox 会重新加载它,而不管任何 Expires 或 Cache-Control 标头。如果文件不包含任何新鲜度信息,Firefox 会重新加载它。
如果有人在他们的观察中发现不同,请更新我。
另一个编辑
从这个链接:
13.2.1 服务器指定的过期时间
过期时间不能用于强制用户代理刷新其显示或重新加载资源;它的语义仅适用于缓存机制,并且此类机制只需要在发起对该资源的新请求时检查该资源的到期状态。有关缓存和历史机制之间差异的解释,请参阅第 13.13 节。
谨慎阅读网上的随机文章(尽管马克·诺丁汉的文章通常是明智的)。最终来源应始终来自 RFC。根据RFC 2616,浏览器应该缓存带有 Expires: 标头的文档,其中时间戳是将来的,或者提供其他有效的缓存指令,前提是该文档未响应 POST 请求而返回。
在没有最后修改时间的情况下设置 max-age 是完全有效的 - 并且规范明确解决了这个问题。
当然,你所描述的似乎非常不寻常,并且暗示 FF4.01 永远不会缓存内容 - 我会惊讶它通过了 QC 检查,但有如此明显的遗漏。您能否提供证明这一点的请求和响应的详细信息(例如使用liveheaders)?
| 归档时间: |
|
| 查看次数: |
5785 次 |
| 最近记录: |