nginx ETag失效

时间:2016-11-21 20:10:01

标签: nginx browser-cache cache-control etag

我正在使用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,但无济于事。

1 个答案:

答案 0 :(得分:1)

当客户端发出条件请求以重新验证过期资源时,将使用ETag。但在你的情况下,资源将不会到2037年到期!浏览器将继续从其缓存中提供资源,直到那时无需检查服务器。这就是你用Expires标题告诉它的内容。

通常,如果您要进行远期过期,则必须通过更改名称来对资源进行版本控制。或者您可以将Expires更改为更短的内容,在这种情况下,当客户端尝试重新验证时,将使用ETags