0

我有一个不同位置的 NGINX 配置。他们都返回一个人index.htmlindex.htmls 是随每个部署构建的。它们包括scriptJavaScript 文件的标签,这些文件在文件名中带有内容哈希,以破坏缓存。

我的问题是,在部署之后,一些必需的脚本正在运行,404因为下载index.html的 JS 文件名中有旧的内容哈希。好像是送的方式有问题index.html,因为是index.html客户端下载的老版本。

这是我的 NGINX 配置中的一个示例位置:

location /my-route {
  try_files $uri /my-route/index.html;
}

当我检查响应标头时,我看到所有 index.html 文件的 ETag。还不足以确保所有index.html文件的正确缓存行为吗?

我的下一个方法是添加一个Cache-Control标题。但我不知道它是否能解决我的问题,因为我无法准确解释为什么它会是正确的解决方案(但我想了解它)。

location /my-route {
  add_header Cache-Control "must-revalidate";
  try_files $uri /my-route/index.html;
}
4

1 回答 1

0

为了使缓存清除策略适用于链接资产(JavaScript 文件等),按照您描述的方式,您需要确保浏览器始终拥有 index.html 的新副本。

这是实现您需要的一种保守方法。仅为 HTML 文件设置一个location块,并为文件名中包含内容哈希的其他资产设置一个单独的位置块。对于您需要的 HTML 文件:

add_header Cache-Control "no-store";

对于文件名中包含内容哈希的资产,请使用:

add_header Cache-Control "max-age: 31536000";

要回答关于在 index.html 文件上发送 ETag 是否足够的问题,答案是否定的。如果没有 Cache-Control 标头,浏览器使用自己的算法来决定是从自己的缓存中检索还是使用 If-None-Match 请求标头访问网络来验证他们已经拥有的副本。

注意:我不熟悉 try_files,但您需要确保如果 try_files 在内部重定向到不同的位置块,则最终位置块会添加正确的标头。

于 2019-01-29T09:22:33.947 回答