【问题标题】:Force Browser Caching Across Browser Sessions跨浏览器会话强制浏览器缓存
【发布时间】:2025-07-07 21:00:01
【问题描述】:

我帮助维护了几个发布新闻和参考信息的基于 Wordpress 的网站。

我们一直在努力使网站上的页面尽可能快地加载。

我们所做的其中一件事是在我们的大多数静态文件(例如图像和 css 文件)的“缓存控制”http 标头中实现非常长的“max-age”时间。

我们使用的特定缓存控制设置是“public, max-age=31536000”。 31,536,000 秒是 365 天。

好处是,事实上,此设置确实会在访问者浏览我们网站的不同页面时缓存静态文件。

但这就是问题所在。这个缓存控制设置在浏览器会话中对我们没有多大作用。即使设置应该告诉浏览器“将此文件缓存一整年”,如果我们网站的访问者关闭了他们的浏览器,然后在五分钟后启动它并返回我们的网站,浏览器坚持重新加载所有静态文件,即使它仍然在缓存中。

我在 Firefox 中仔细检查了这一点,查看了带有 Live HTTP 标头的标头。但我也可以定性地看到在其他浏览器中发生了同样的事情。

显然,如果在当前浏览器会话期间内容没有被加载一次,浏览器会坚持重新加载网站的所有内容。

那么……我们有什么方法可以向浏览器“礼貌地建议”它们总是从缓存中加载缓存的内容,即使浏览器在当前浏览器会话期间没有访问我们的网站?

【问题讨论】:

  • 我花了很多时间进一步研究我上面描述的问题。似乎该问题主要发生在 Internet Explorer 上。我最初在 Firefox 中观察到的问题是由于我的特定版本的 Firefox 中的离线存储设置造成的。更改设置后,Firefox 现在似乎非常擅长跨浏览器会话使用缓存内容,而 Chrome 在同一方面似乎也表现良好。 Internet Explorer(我已经用 IE7 完成了大部分测试)不是很好。我会做更多的测试并报告我的发现。

标签: caching http-headers browser-cache cache-control


【解决方案1】:

还要检查 ETag、Expires 和 Last-Modified 标头。

您需要一个 Expires 标头,有时 ETag 和 Last-Modified 会破坏缓存。

【讨论】:

  • 感谢@ScottAnderson 的反馈。
  • 不幸的是,我们无法控制大多数静态内容的 Etag 和 Expires 设置,因为它是通过 CDN 提供的,而 CDN 服务无法让我们控制这些 HTTP标题。
  • 我们使用的 CDN 会自动将 ETag 标头附加到它所服务的静态文件中。如果我们设置“cache-control”标头,它不会为文件提供“Expires”标头。也就是说,我们为页面提供的其他文件——它们来自 Google 的 API 服务——具有较长的“max-age”设置,带有“Expires”标头和没有 Etag 标头,并且它们正在跨浏览器会话重新读取就像我们的文件一样。所以问题的根源不是缺少 Expires 标头,也不是包含 Etag 标头。