为什么 Firefox 会忽略缓存标头并在刷新时重新验证?

Dmi*_*sky 2 browser firefox caching http http-headers

我有一些不可变的图像资源,可以永久缓存。Chrome 似乎尊重我的响应标头,并且不会重新验证资源:

Chrome 请求

以下是 Chrome 中这些资源之一的示例。正如你所看到的,我包括cache-control: public, max-ageexpiresetaglast-modified和资源从“内存缓存”服务:

Chrome 请求


但是,Firefox 不尊重这些标头并在每次加载时重新验证资源!每次页面加载时,我的服务器都会收到对每个个人资料图片的请求,并返回 304:

Firefox 请求

这是导致 304 的此类请求的示例:

火狐请求

我不明白为什么 Firefox 会忽略缓存标头并继续访问 304 的服务器。我已经尝试了各种与缓存相关的标头并阅读了关于什么是"cacheable"的标准。我确保在 devtools 中启用了缓存。我也尝试过关闭 devtools,但我一直在服务器日志中看到 304。

我发现这只会在页面刷新时发生。但是,普通刷新,不是 shift- 或 shift-command-,而只是普通刷新。这不是我期望的行为。

Kev*_*nry 5

简单地说:Firefox 在浏览器刷新时重新验证缓存的内容。

这曾经是所有浏览器所做的。一度假设如果用户主动刷新他们的页面是因为出现问题,他们需要从头开始,这可能是合理的。现在,随着显示实时内容的网站的出现,“刷新”的使用可能大不相同。

Chrome 和 Firefox 似乎采取了不同的方式来解决这个问题。Chrome 的方法是使其刷新行为更智能、更复杂,而 Firefox 选择依赖开发人员通过使用Cache-Control: immutable响应标头明确指示非陈旧资源永远不需要重新验证。(有关区别的更多信息,请参阅此答案)。

如果此刷新行为是您的应用程序的重要用例(而不是仅用于调试目的的东西),则添加Cache-Control: immutable应该可以解决 Firefox 中的这个问题。(需要注意的是,根据MDN,火狐只有方面immutablehttps内容,所以这仍然您在不工作http上面的测试页。)

  • 不知道为什么“不可变”也不起作用。我只是再次尝试将其添加到我的缓存控制指令列表中。没有运气。不管怎样,刷新时,FF 会重新生效。`stale-while-revalidate` 似乎也没有加快速度,而且它会重新验证。我想这就是 FF 的运作方式。 (2认同)