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