我有一些不可变的图像资源,可以永久缓存。 Chrome似乎尊重我的响应标头,并且不重新验证资源:
这是Chrome中这些资源之一的示例。如您所见,我包括cache-control: public, max-age
,expires
,etag
和last-modified
,并且资源是从“内存缓存”中提供的:
但是,Firefox不遵守这些标头,并且会在每次加载时重新验证资源!每次页面加载时,我的服务器都被要求提供每个个人资料图片的请求,并返回304:
这是在这样的请求上导致304的示例:
我不知道为什么Firefox会忽略缓存头,并继续使用304。我已经尝试了各种与缓存相关的头,并阅读了"cacheable"的标准。我确保在devtools中启用了缓存。我也尝试过关闭devtools,在服务器日志中仍然看到304。
我发现这仅在刷新页面时发生。普通刷新不是shift或shift命令,而是普通刷新。那不是我所期望的行为。
简单地说:Firefox在浏览器刷新时重新验证缓存的内容。
这曾经是所有浏览器的工作方式。一次假设如果用户正在积极刷新其页面可能是合理的,这是因为出现了问题并且需要从头开始。现在,随着显示实时内容的网站的出现,“刷新”的使用可能会大为不同。
Chrome和Firefox似乎采取不同的方式来处理此问题。 Chrome浏览器的方法是使其刷新行为更智能,更复杂,而Firefox选择了明确依赖开发人员,以指示使用Cache-Control: immutable
响应标头从无需重新验证非陈旧资源。 (有关此区别的更多信息,请参见Cache-Control: immutable
。)>
如果此刷新行为对于您的应用程序而言是重要的用例(而不是仅用于调试目的,则添加this answer应该可以在Firefox中解决此问题。
只是更详细些,让我详细介绍一下ETag。从技术上讲,Firefox可以正确处理它。当存在Etag时,客户端或中间缓存需要执行GET或HEAD,以确保提供的内容没有更改。