我正在使用nginx.conf
中的以下代码缓存静态资源:
http {
...
gzip on;
gzip_types *;
gzip_vary on;
...
server {
...
location /static {
alias /opt/static_root;
expires max;
}
}
}
这足以设置以下http标头:
$ curl -I example.com/static/css/bootstrap.min.css
Content-Length: 97874
Last-Modified: Mon, 21 Nov 2016 18:30:33 GMT
ETag: "58333d49-17e52"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
但是,即使Last-Modified
日期晚于浏览器的缓存版本,我仍然会看到该文件的旧版本(在Firefox 50.0和Chrome 54.0.2840.98上测试)。
如何使ETag无效,以便每当我将差异部署到我的静态文件时,浏览器都会理解为重新加载它们?
我尝试了nginx -s reload
,但无济于事。
答案 0 :(得分:1)
当客户端发出条件请求以重新验证过期资源时,将使用ETag。但在你的情况下,资源将不会到2037年到期!浏览器将继续从其缓存中提供资源,直到那时无需检查服务器。这就是你用Expires
标题告诉它的内容。
通常,如果您要进行远期过期,则必须通过更改名称来对资源进行版本控制。或者您可以将Expires
更改为更短的内容,在这种情况下,当客户端尝试重新验证时,将使用ETags
。