每当我们发布网站的新版本时,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中的元标记:
现在的问题是:有没有办法修复这个问题,或者这是谷歌浏览器的默认行为?感谢大家抽出时间阅读这个问题,如果太长请见谅。
该网站使用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";
}
}
}
现在的问题是:有没有办法修复这个问题,或者这是谷歌浏览器的默认行为?感谢大家抽出时间阅读这个问题,如果太长请见谅。