Cache-control 无缓存,但不在 Nginx 中的子文件夹上

Cache-control 无缓存,但不在 Nginx 中的子文件夹上

我在 Nginx 中使用此规则

location ~ /app/(?<code>...)/acme/?(?<uri>.*) {
  add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
  proxy_pass http://int-srv/$code/acme/dev/$uri;
}

这会在调用时添加我上面写的 Cache-control 标头

/app/abc/acme
/app/abc/acme/assets
/app/abc/acme/assets/js
/app/abc/acme/assets/css
/app/abc/acme/anything

我只希望将 Cache-control 标头应用于 /app/abc/acme,因为调用此端点时,响应是我们的 index.html 的内容。我不想缓存它,目前它运行良好。

如果您想使用 index.html 制定规则,不幸的是,它将不起作用,因为我没有看到我们在 chrome 调试器工具中直接调用文件 (/app/abc/acme/index.html)

所以基本上这就是我想要的

/app/abc/acme - apply cache-control no-cache,etc header to this location only
/app/abc/acme/assets - don't want cache-control header
/app/abc/acme/assets/js - don't want cache-control header
/app/abc/acme/assets/css - don't want cache-control header
/app/abc/acme/anything - - don't want cache-control header

如果您认为我做了坏事,请告诉我。

答案1

您可以使用两个位置,其中一个与较短的 URL 匹配。例如:

location ~ ^/app(?<code>/...)/acme/(?<stuff>.*)$ {
    add_header Cache-Control "max-age=0, no-cache, no-store, must-revalidate";
    rewrite ^ $code/acme/dev/$stuff break;
    proxy_pass http://int-srv;
}
location ~ ^/app(?<code>/...)/acme$ {
    rewrite ^ $code/acme/dev break;
    proxy_pass http://int-srv;
}

该变量名称$uri已由系统定义,因此您可能应该使用不同的名称。

在正则表达式位置中使用 URI 组件proxy_pass显然是可行的,但没有记录。事实上,文档状态:

使用正则表达式指定位置时。在这种情况下,指令应不带 URI 指定

因此我的例子使用了rewrite ... break

相关内容