如何仅为根路径配置缓存响应 header?

how to configure cache response header for root path only?

我正在为静态文件使用 nginx,并希望所有文件都应该由浏览器缓存,而不是 index.html。尝试了以下配置,但我也得到了 index.html 的缓存响应 header。 我该如何更改配置?

server{
  location = / {
   try_files $uri $uri/ =404;
  }
  location / {
   try_files $uri $uri/ =404;
   add_header 'Cache-Control' "public, max-age=3600";
  }
}

要了解 try_files $uri $uri/ ... 指令的逻辑(以及整个 nginx 行为),我建议您阅读 this 在 ServerFault 的回答。最重要的是

The very important yet absolutely non-obvious thing is that an index directive being used with try_files $uri $uri/ =404 can cause an internal redirect.

这是您当前配置的情况。 try_files 指令的 $uri/ 参数导致 nginx 进行从 //index.html 的内部重定向,而该 URI 又由 location / { ... } 处理,不是 location = / { ... }!要实现你想要的,你可以使用

location = /index.html {
    try_files $uri $uri/ =404;
}
location / {
    try_files $uri $uri/ =404;
    add_header 'Cache-Control' "public, max-age=3600";
}

此外,由于 try_files $uri $uri/ =404; 是默认的 nginx 行为,您可以进一步将其简化为

location = /index.html {}
location / {
    add_header 'Cache-Control' "public, max-age=3600";
}