理解NGINX默认缓存

理解NGINX默认缓存,nginx,nginx-config,Nginx,Nginx Config,我有一个不同位置的NGINX配置。它们都返回一个单独的index.html。index.htmls是在每次部署时构建的。它们包括JavaScript文件的script标记,这些文件在文件名中带有内容散列,以破坏缓存 我的问题是,在部署之后,一些必需的脚本是404ing,因为下载的index.html在JS文件名中有旧的内容哈希。交付index.html的方式似乎有问题,因为它是客户机下载的index.html的旧版本 这是我的NGINX配置中的一个示例位置: location /my-route

我有一个不同位置的NGINX配置。它们都返回一个单独的
index.html
index.html
s是在每次部署时构建的。它们包括JavaScript文件的
script
标记,这些文件在文件名中带有内容散列,以破坏缓存

我的问题是,在部署之后,一些必需的脚本是
404
ing,因为下载的
index.html
在JS文件名中有旧的内容哈希。交付
index.html
的方式似乎有问题,因为它是客户机下载的
index.html
的旧版本

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

location /my-route {
  try_files $uri /my-route/index.html;
}
当我检查响应头时,我看到所有index.html文件都有一个ETag。这还不足以确保所有
index.html
文件的缓存行为正确吗

我的下一个方法是添加
缓存控制
头。但我不知道它是否能解决我的问题,因为我无法确切解释为什么它是正确的解决方案(但我想了解它)


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

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

add_header Cache-Control "no-store";
对于文件名中包含内容哈希的资产,请使用:

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


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

您是否有
expire
调用?没有,仅适用于某些其他资源(如PNG)。我应该要一个吗?
add_header Cache-Control "max-age: 31536000";