谷歌浏览器不遵守 Cache-Control 中的 max-age 参数

5

我有一个React应用程序,其中我正在对后端API进行fetch请求。

我正在尝试在UI端实现缓存以处理大量请求,在Mozilla Firefox中成功实现了它并且运行良好。但是Chrome经常会让我很困扰。这里是我正在尝试实现的代码 -

        fetch(URL, {
            signal: this.abortController.signal,
            cache: "default",
            headers: {
                "Cache-Control": "max-age=120"
            }
        })
            .then(response => return response.json())
            .catch(error => {
                if (error.name === "AbortError") {
                    return;
                }
                this.setError(error);
            });

我遵循以下步骤来检查缓存-

  1. 首先打开执行fetch请求的选项卡。
  2. 将选项卡更改为另一个选项卡。
  3. 在超时期限(120秒)内返回到第1步中提到的选项卡。

在Firefox的网络选项卡中检查时,我可以看到“传输”显示为“缓存”,页面加载明显改善,一切都按预期工作。

然而,在Chrome中,我仍然可以看到“大小”为“3.9 KB”,时间为一些“ms”。

我尝试了- Is Chrome ignoring Cache-Control: max-age?中提到的步骤,但没有成功。

我还发现- https://www.mnot.net/blog/2017/03/16/browser-caching上说:

Chrome仅支持max-age = 0的请求,并且只支持值为0。它不支持min-fresh或max-stale。

但这篇文章比较旧(2017年),我不确定它是否仍然正确。

此外,查看Fetch规范 - https://fetch.spec.whatwg.org/#concept-request-cache-mode,'default'是我需要的缓存模式,但我不确定为什么它在Chrome上无法工作。

有没有人能够指导我?怎样才能使其在Firefox和Chrome中都正常工作?

编辑 - 好吧,在Google Chrome和Firefox中将“cache”用作“force-cache”可以工作。

来自- https://hacks.mozilla.org/2016/03/referrer-and-cache-control-apis-for-fetch/

“default”表示使用浏览器下载资源的默认行为。 Firefox和Chrome的默认行为是否不同?由于这是浏览器的默认行为,所以取决于浏览器如何使用它。

此外,

“force-cache”表示如果在缓存中发现匹配的条目,则浏览器将始终使用缓存的响应,而忽略响应的有效性。因此,即使在缓存中找到了非常旧版本的响应,也将始终在不进行验证的情况下使用它。

我不确定“force-cache”在Chrome中的工作原理,但这不是我需要的。


我只在服务器端设置了最大年龄,当发送回响应时。在您的示例中,似乎是在客户端发出请求时设置的? - mortb
是的,我正在客户端设置它。由于它是第三方的,我对服务器端响应没有太多控制。 - rai-gaurav
建议您在此处使用本地存储:https://dev59.com/R2cs5IYBdhLWcg3wiEiK - mortb
你可以在这里阅读更多内容。https://dev59.com/S6Xja4cB1Zd3GeqPP1pA - mortb
@rpg600 是的,我正在使用自签名 SSL 证书。 - rai-gaurav
显示剩余4条评论
1个回答

5

这是一个在2011年报告并仍然存在的Chrome / Chromium问题:

对于自签名SSL证书,Chrome完全忽略所有缓存指令,并始终重新加载所有内容。

https://bugs.chromium.org/p/chromium/issues/detail?id=103875

以下是一些解决方法:

  • 您可以成为CA,注册自己的证书并将此CA导入Chrome权限(在chrome://settings/certificates中),有关更多详细信息,请参见使Chrome接受自签名的本地主机证书这是我目前使用的解决方案。
  • 使用免费的Letsencrypt ssl证书。它对我不起作用,因为我使用.docker域,它不是有效的公共后缀,因此无法获得证书。
  • 您可以使用http URL而不是https进行缓存测试,但是Chrome会触发混合内容错误,您需要在Chrome设置中禁用该错误。
  • 只需使用Firefox进行缓存测试。

希望这可以帮到您,祝好运。


感谢提供错误链接和替代方案。我之前已经放弃了这个问题,开始使用Firefox浏览器。我会尝试使用提供的替代方案。非常感谢。 - rai-gaurav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接