如何在Nginx上为静态文件启用ETag头?

36
我正在使用Nginx作为web服务器,希望实现浏览器缓存方法,使用户在本地保留静态未更改文件的副本,并仅下载更改的文件。其中一个提议是使用文件的时间戳来找出更改的文件并仅刷新它们,但在我的情况下这是不可能的,因为每次新的部署后,整个Web应用程序的新版本将被创建,并且所有文件的时间戳都会更改。
我研究了一下ETag标头,它似乎是一个相当不错的解决方案,但我发现ETags尚未得到Nginx的官方支持。
有没有办法在Nginx上实现ETags或替代方案?

1
如果您使用gzip off;行禁用了gzip,则可以在响应中看到etag头。 - efkan
3
请记住,nginx使用文件的最后修改日期和文件大小生成etag。 - Christoph Wimberger
3
如果你看到一个安全扫描器(例如Nikto)关于ETags泄漏inode的投诉,如果你正在运行nginx,那么这可能是一个误报,因为[nginx不会在ETags中包含inodes](http://serverfault.com/questions/690341/algorithm-behind-nginx-etag-generation)。它可以在apache中禁用,尽管apache默认情况下会泄露inodes(请参见“FileETag”指令)。 - Synchro
相关链接:https://dev59.com/b7Lma4cB1Zd3GeqPfbsv - Jesse Nickles
2个回答

41

升级您的Nginx。

Syntax:     etag on | off;
Default:    etag on;

Context:    http, server, location

This directive appeared in version 1.3.3.

Enables or disables automatic generation of the “ETag” response header field for static resources.

来源: http://nginx.org/en/docs/http/ngx_http_core_module.html#etag


11
谢谢,我已经尝试了,并且Etag头已添加到HTTP头中,但是即使我删除了Last Modified头,缓存验证仍然依赖于文件的时间戳。我希望在检查文件是否真正更改内容时进行检查,而不仅仅是验证文件的时间戳。 - HanouaJ
升级到什么? - Altimus Prime
1
@AltimusPrime 这个问题是几年前的,当时 Nginx 默认没有包含 ETags(现在 v1.3.3 之后已经包含了)。 - Jesse Nickles

30

所有版本最近的 Nginx(新于1.3.3)都会自动设置这些参数。

例如:

location /img {
    root /path/to/public;
}

响应头将返回 Etag + Last-Modified 头。


4
这正是我寻求的答案。如果你的回答中包含有关该功能的Nginx文档/发行说明的链接,那就更好了。谢谢。 - Mark Edington
你知道Nginx会自动生成哪些文件类型的ETags吗?如果知道,请考虑在这里回答我的问题,谢谢!https://serverfault.com/questions/1110002/which-static-file-types-does-nginx-generate-etags-for-by-default - Jesse Nickles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接