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

问题描述 投票:0回答:2

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

Chrome requests

这是Chrome中这些资源之一的示例。如您所见,我包括cache-control: public, max-ageexpiresetaglast-modified,并且资源是从“内存缓存”中提供的:

Chrome request


但是,Firefox不遵守这些标头,并且会在每次加载时重新验证资源!每次页面加载时,我的服务器都被要求提供每个个人资料图片的请求,并返回304:

Firefox requests

这是在这样的请求上导致304的示例:

Firefox request

我不知道为什么Firefox会忽略缓存头,并继续使用304。我已经尝试了各种与缓存相关的头,并阅读了"cacheable"的标准。我确保在devtools中启用了缓存。我也尝试过关闭devtools,在服务器日志中仍然看到304。

我发现这仅在刷新页面时发生。普通刷新不是shift或shift命令,而是普通刷新。那不是我所期望的行为。

http firefox caching browser http-headers
2个回答
1
投票

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

这曾经是所有浏览器的工作方式。一次假设如果用户正在积极刷新其页面可能是合理的,这是因为出现了问题并且需要从头开始。现在,随着显示实时内容的网站的出现,“刷新”的使用可能会大为不同。

Chrome和Firefox似乎采取不同的方式来处理此问题。 Chrome浏览器的方法是使其刷新行为更智能,更复杂,而Firefox选择了明确依赖开发人员,以指示使用Cache-Control: immutable响应标头从无需重新验证非陈旧资源。 (有关此区别的更多信息,请参见Cache-Control: immutable。)>

如果此刷新行为对于您的应用程序而言是重要的用例(而不是仅用于调试目的,则添加this answer应该可以在Firefox中解决此问题。


0
投票

只是更详细些,让我详细介绍一下ETag。从技术上讲,Firefox可以正确处理它。当存在Etag时,客户端或中间缓存需要执行GET或HEAD,以确保提供的内容没有更改。

© www.soinside.com 2019 - 2024. All rights reserved.