nginx ETag 失效
nginx ETag invalidation
我在 nginx.conf
:
中使用以下代码缓存静态资源
http {
...
gzip on;
gzip_types *;
gzip_vary on;
...
server {
...
location /static {
alias /opt/static_root;
expires max;
}
}
}
这足以设置以下 http headers:
$ 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
,没用。
当客户端发出条件请求以重新验证过期资源时,将使用 ETag。但在您的情况下,资源要到 2037 年才会过期!在此之前,浏览器将继续从其缓存中提供资源,而无需与服务器进行检查。这就是你用 Expires
header.
告诉它的
通常,如果您要这样做 far-future 过期,您必须通过更改名称来对资源进行版本控制。或者您可以将 Expires
更改为更短的内容,在这种情况下,当客户端尝试重新验证时将使用 ETags
。
我在 nginx.conf
:
http {
...
gzip on;
gzip_types *;
gzip_vary on;
...
server {
...
location /static {
alias /opt/static_root;
expires max;
}
}
}
这足以设置以下 http headers:
$ 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
,没用。
当客户端发出条件请求以重新验证过期资源时,将使用 ETag。但在您的情况下,资源要到 2037 年才会过期!在此之前,浏览器将继续从其缓存中提供资源,而无需与服务器进行检查。这就是你用 Expires
header.
通常,如果您要这样做 far-future 过期,您必须通过更改名称来对资源进行版本控制。或者您可以将 Expires
更改为更短的内容,在这种情况下,当客户端尝试重新验证时将使用 ETags
。