我有一个在 docker 中运行的 nginx 作为静态服务器。当我更新服务器端文件夹template.xlsx
文件时。下载仍然返回旧文件,我确定我已将静态template.xlsx
文件替换为新文件。如何让 nginx 返回新的 nginx 文件?这是静态 nginx 配置:
server{
listen 443 ssl;
ssl_certificate /etc/nginx/conf.d/cert/example.com/fullchain1.pem;
ssl_certificate_key /etc/nginx/conf.d/cert/example.com/privkey1.pem;
server_name static.example.com;
location / {
root /usr/share/nginx/html/static;
client_max_body_size 50m;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
index index.html index.htm;
}
}
我尝试重新启动 docker 容器似乎仍然没有返回新模板。
默认情况下,nginx 使用
off
by expires指令。这意味着 nginx 不会添加或修改“Expires”和“Cache-Control”响应头字段。对于静态文件,这意味着在没有两个标头的情况下客户端(浏览器)可以自由选择如何缓存资源(这对您来说是与HTTP 规范相关的未定义行为,因为它可能存储成功的响应,例如当前会话甚至更长的时间,具体取决于其设置,除非它正在刷新请求(来自浏览器的 F5/Ctrl+F5 或If-Modified-Since
,或来自客户端If-None-Match
的请求标头)。Cache-Control
Pragma
重新启动 nginx(或 docker 容器)在这里根本没有帮助,因为它是可以使用缓存文件的浏览器/客户端。在浏览器中,您可以使用 DevTools (F12) -> Network 来监控如果您开始下载会发生什么(以及您的浏览器通过请求发送哪些标头并从 nginx 接收响应)。
你可以:
expires -1;
或添加Cache-Control: no-cache
标题(请注意,不建议完全禁用所有静态的缓存,至少不要对更改非常罕见的资源这样做,例如图片,样式和 JS )template.xlsx?ver=2
,例如发送带有一些增量后缀的请求,如?ver=...
这里(或简单的时间戳);Cache-Control: no-cache
;Pragma: no-cache