7

我正在寻找用于 css/js 缩小、压缩等的Chirpy。我注意到它不支持缓存。它没有任何发送过期标头、etag 等的逻辑。

缺少此功能使我怀疑缓存内容是否不是那么重要。慢!给这个评分,所以我有点困惑。现在我正在研究缓存,但无法解释为什么SuperFish.css要从缓存中检索这个 css 文件。

  1. 访问http://www.weirdlover.com(Chirpy 的开发者)

    初始下载

  2. 查看初始网络轨迹。请注意, 没有过期标头SuperFish.css

    第一次拉

  3. 重新访问该页面并再次检查网络跟踪。现在SuperFish.css从缓存中检索。

    缓存图像

为什么SuperFish.css在重新访问页面时从缓存中检索?即使我关闭所有 chrome 实例然后重新访问该页面,也会发生这种情况。

4

2 回答 2

4

这似乎符合 HTTP 规范。

13.4 响应可缓存性

除非受到缓存控制(第 14.9 节)指令的特别限制,否则缓存系统可以始终将成功的响应(参见第 13.8 节)存储为缓存条目,如果它是新鲜的,则可以不经验证地返回它

13.2.2 启发式过期

由于源服务器并不总是提供明确的过期时间,因此 HTTP 缓存通常会分配启发式过期时间,使用使用其他标头值(例如 Last-Modified 时间)的算法来估计合理的过期时间。

似乎没有提供缓存控制标头,并且省略了 expires 标头,客户端可以自由地使用启发式方法来生成到期日期,然后根据该日期缓存响应。

etag 的存在对此没有影响,因为 etag 用于重新验证过期的缓存条目,在这种情况下,chrome 认为缓存的条目是新鲜的(同样适用于 last-modified),因此它没有t 尚未过期。

一般原则是,如果源服务器关心新鲜度,它应该明确说明。

于 2012-01-05T17:25:53.767 回答
0

在这种情况下(当服务器没有返回 Expires 头时),浏览器应该使用 If-Modified-Since 头发出 HTTP 请求,如果服务器返回 HTTP 304 Not modified 则浏览器从缓存中获取数据。但是,我知道,现在浏览器在数据在缓存中时不会发出任何请求。我认为他们这样做是为了获得更好的响应时间。

于 2012-01-05T17:05:18.230 回答