使用 try_files 指令禁用单个文件的缓存

问题描述 投票:0回答:8

我通过这种方式使用位置部分为 Angular 2 应用程序提供服务:

location / {
  try_files $uri $uri/ /index.html =404;
}

try_files 指令尝试在根目录中查找请求的 uri,如果找不到,则仅返回 index.html

如何禁用index.html文件的缓存?

angular nginx
8个回答
69
投票

找到了使用 nginx 命名位置的解决方案:

location = / {
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
}

location / {
    gzip_static on;
    try_files $uri @index;
}

location @index {
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
}

24
投票

感谢雷姆的精彩回答! 正如何世明在接受的解决方案中指出的那样,在访问根目录时不会添加缓存标头,例如www.example.com/,但在访问任何深层链接时会被添加,例如www.example.com/some/path。

经过大量挖掘,我相信这是因为ngnix模块ngx_http_index_module的默认行为,它默认包含index.html,因此当访问根/时,第一个位置块的规则得到满足,并且index.html得到在没有缓存控制标头的情况下提供服务。 我使用的解决方法是包含一个索引指令,而不在第一个位置块中指定index.html,强制从第二个位置块提供根 / 。

我还有另一个问题,我在第一个位置块中包含了一个根指令,这破坏了深层链接,也是一个坏主意。 我将 root 指令移至服务器级别。

希望这有帮助,这是我的解决方案......

server {
  listen       80;
  server_name  localhost;
  root   /usr/share/nginx/html;

  location / {
    add_header X-debug-whats-going-on 1;
    index do-not-use-me.html;
    try_files $uri @index;                 
  }

  location @index {
    add_header X-debug-whats-going-on 2;
    add_header Cache-Control no-cache;
    expires 0;
    try_files /index.html =404;
  }
}

我添加了调试标头,以帮助完全清楚哪个位置块正在提供哪些内容。 还值得注意的是 add_header 指令的不直观行为,如果您还打算向位置块之外的所有请求添加标头,则必须阅读该内容。


23
投票

try_files
后备以及默认的
index
指令都会导致内部 nginx 重定向。因此,您可以使用
/index.html
位置为这两种情况添加标题。

location / {
  try_files $uri $uri/ /index.html;
}

location = /index.html {
  expires -1;
}

索引:

需要注意的是,使用索引文件会导致内部重定向,并且可以在不同的位置处理请求

http://nginx.org/en/docs/http/ngx_http_index_module.html

尝试文件:

如果未找到任何文件,则会内部重定向到最后一个参数中指定的 uri。

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files


9
投票

您可以使用内容类型映射(应该使用一个

.html
文件完成 SPA 的工作):

map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch; # means no-cache
}

server {
  expires $expires;
}



7
投票

我对 Angular 应用程序进行了以下设置,包括对 index.html 和 nginx 配置的更改:

index.html

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

nginx.conf

location / {
  try_files $uri $uri/ /index.html;
}

location ~ \.html$ {
  add_header Cache-Control "private, no-cache, no-store, must-revalidate";
  add_header Expires "Sat, 01 Jan 2000 00:00:00 GMT";
  add_header Pragma no-cache;
}

当用户导航到“site.com”和“site.com/some/url”或“site.com/#/login”时都有效。 “index.html”的更改主要是为了安全起见。


1
投票

为了安全起见:)

location = /index.html {
    add_header 'Cache-Control' 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    expires off;
}        

0
投票

我设法通过在

/etc/nginx/conf.d/default.conf
泊坞窗中的
nginx:stable-alpine
中添加几行来做到这一点:

server {
    listen       80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        add_header Cache-Control 'no-cache, no-store, must-revalidate'; # <-- added this
        expires 0; # <-- added this
    }
}

/
/index.html
路径都禁用缓存。


0
投票

找到了另一个解决方案。

location / {
    try_files $uri $uri/ /index.html;
    add_header Cache-Control "no-cache, no-store, must-revalidate";
    add_header Pragma "no-cache";
    add_header Expires 0;
}

# Cache static files
location ~* \.(js|css|jpg|jpeg|gif|png|ico|svg|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public";
}

这个效果很好。

接受的解决方案https://stackoverflow.com/a/41632171/9272654不适用于路线刷新,但此解决方案工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.