Google chrome 不遵守 Cache-Control 中的 max-age

Google chrome not respecting max-age in Cache-Control

我有一个 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. 首先打开正在执行获取请求的选项卡。
  2. 将选项卡更改为其他选项卡。
  3. Return 在超时期限(120 秒)内返回步骤 1 中提到的选项卡

在 Firefox 的网络选项卡中检查时,我可以看到 'Transferred' 为 'cached',并且页面加载有了显着改善,一切都按预期工作。

但是,在 Chrome 中,我仍然可以看到带有“3.9 KB”的 'Size' 和带有一些 'ms' 的时间。

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

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

Chrome only supports max-age=0 in requests, and only with the value 0. It does not support min-fresh or max-stale.

但它有点老了(2017 年),我不确定它是否仍然适用。

此外,查看 Fetch 规范 - https://fetch.spec.whatwg.org/#concept-request-cache-mode 'default' 是我需要的缓存模式,但我不确定为什么它不能跨 chrome

谁能指导我正确的方向?需要做什么才能使其在 firefox 和 chrome 中工作?

EDIT - 好的,使用 'cache' 作为 'force-cache' 在 google chrome 和 firefox 中都有效。

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

“default” means use the default behavior of browsers when downloading resources. Is the default behavior different for firefox and chrome ? Since it is default behavior of a browser, it upto browser how they use this.

此外,

“force-cache” means that the browser will always use a cached response if a matching entry is found in the cache, ignoring the validity of the response. Thus even if a really old version of the response is found in the cache, it will always be used without validation.

我不确定 'force-cache' 如何为 chrome 工作,但这是我不需要的东西。

这是 2011 年报告的 chrome/chromium 问题,目前仍未解决:

With self-signed SSL certificates, Chrome completely ignores all caching directives, and always reloads all content.

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

我看到了一些替代方案:

  • 您可以成为 CA,以 CA 身份签署您的证书,并将此 CA 导入 chrome 机构(在 chrome://settings/certificates),请参阅 Getting Chrome to accept self-signed localhost certificate 更多细节。 这是我目前使用的解决方案。
  • 在 Letsencrypt 中使用免费的 ssl 证书。它对我不起作用,因为我使用 .docker 域并且它不是有效的 public 后缀,因此无法获得证书。
  • 您可以使用 http url 而不是 https 进行缓存测试,但 Chrome 会触发混合内容错误,您需要在 chrome 设置中将其禁用。
  • 只需使用 Firefox 进行缓存测试。

希望这对您有所帮助,祝您好运。