如何在301重定向后防止Chrome从磁盘缓存加载index.html?

7
每当我们发布网站的新版本时,chrome缓存会出现问题。我们搜索了数天,并添加/删除了可能引起此问题或被认为可以解决此问题的任何标头、元标记、nginx配置等,但仍然没有改变。index.html仍然被缓存,我们必须按F5才能在随机计算机上看到新更改。
该网站使用angularjs框架实现SPA,使用ngnix进行托管,而ngnix则位于traefik代理后面,使用traefik规则将HTTP请求强制重定向到HTTPS响应301。
今天我发现了失败的情况!如果用户在地址栏中输入https协议(例如https://example.com),一切正常,但是如果用户回来尝试访问http://example.com,chrome将通过301重定向缓存将用户重定向到https,然后加载不是我们想要的缓存版本的index.html。 301重定向缓存无妨,但我们希望chrome从服务器获取index.html而不是从磁盘缓存中加载它!
注意:只要用户使用HTTPS,就会从服务器加载索引或获得304响应,我们希望在用户仅输入域本身时就发生这种情况,而不是使用HTTPS。
以下是添加到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="pragma" content="no-cache" />

以下是我们的nginx配置的部分内容:

...
http {
    ...
    proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=prerender_cache:100m max_size=10g inactive=1d;
    proxy_cache_key "$request_method$host$request_uri$is_args$args";
    ...
    server {
        access_log /dev/stdout combined1;
        listen      80 default_server;
        server_name example.com;
        root /app;
        index  index.html;
        ...
        location ~ ^/(assets|static|styles) {
            expires     31d;
            add_header  Cache-Control public;
        }
        location @asset_pass {
            root app/;
            try_files $uri =404;
        }
        location / {
            expires -1;
            add_header Pragma "no-cache";
            add_header Cache-Control "no-store, no-cache, must-revalicate, post-check=0 pre-check=0";
            try_files $uri @prerender;
            autoindex on;
        }
        location ~ \.html$ {
            expires -1;
            add_header Pragma "no-cache";
            add_header Cache-Control "no-store, no-cache, must-revalicate, post-check=0 pre-check=0";
        }
    }
}

现在的问题是:有没有办法修复这个问题,或者这是谷歌浏览器的默认行为?感谢大家抽出时间阅读这个问题,如果太长请见谅。

这里有一个可能会有帮助的问题链接:https://dev59.com/N1oT5IYBdhLWcg3wxxsk - IBirle
@IBirle,感谢提供链接,但我们更倾向于使用非JS的方式来解决这个问题。如果我们决定使用JS,我们可以实现一个强制重新加载功能,从后端检查最新的前端版本。 - M-N
你找到任何方法了吗?@M-N - Anu
很抱歉,@A.Anwin,我们只是使用我之前评论中描述的方法作为临时解决方案。 - M-N
1个回答

0
你可以尝试使用touch命令更新index.html文件的修改时间,这样响应头中的last-modified就会变成最新的日期和时间,浏览器就会将这个资源视为“过时”,从而遵循最新的301规则。

1
我们已经在做这个了,我们会创建新的index.html文件,就像我在问题中提到的那样。不幸的是,在特定情况下,Chrome不会向服务器发送请求,并从本地缓存加载数据。所以这种方法行不通。 - M-N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接