如何在 Nginx 上配置 ETag
Posted
技术标签:
【中文标题】如何在 Nginx 上配置 ETag【英文标题】:How to configure ETag on Nginx 【发布时间】:2014-08-24 07:43:51 【问题描述】:我使用 nginx 作为网络服务器,并希望实现浏览器缓存方法,以便用户在本地保留静态未更改文件的副本并仅下载更改的文件。其中一个建议是使用文件时间戳来找出更改的文件并仅刷新它们,但这在我的情况下是不可能的,因为在每次新部署之后,都会创建整个 Web 应用程序的新版本并且所有文件的时间戳改变。
我对 ETag 标头进行了一些研究,这似乎是一个不错的解决方案,但我发现 Nginx 尚未正式支持 Etag。
有没有办法在 Nginx 上实现 Etags 或任何替代解决方案?
【问题讨论】:
如果您使用gzip off;
行禁用gzip
,您可以在回复中看到etag
标头。
记住,nginx使用文件的最后修改日期和文件大小来生成etag。
如果您看到来自安全扫描程序(Nikto 等)的有关 etag 泄漏 inode 的投诉,如果您正在运行 nginx,则可能是误报,因为 nginx does not include inodes in etags。它可以在 apache 中禁用,尽管默认情况下 apache 确实会泄漏 inode(请参阅FileETag
指令)。
【参考方案1】:
升级你的 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
【讨论】:
谢谢,我已经尝试过了,并且 Etag 标头已添加到 HTTP 标头中,但即使我删除了 Last Modified 标头,缓存验证仍然依赖于文件的时间戳。我希望检查文件是否真的在内容上有变化,而不仅仅是通过验证文件的时间戳 升级到什么?【参考方案2】:所有最新版本的 Nginx(高于 1.3.3)都会自动设置这些。
例如:
location /img
root /path/to/public;
并且将返回响应头 Etag
+ Last-Modified
头。
【讨论】:
这是我一直在寻找的答案。如果您的回答还包含有关此功能的 Nginx 文档/发行说明的链接,那就太好了。谢谢。以上是关于如何在 Nginx 上配置 ETag的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IIS 上为 text/html 页面使用 eTag
如何根据返回的 etag 使用 curl 缓存 api 响应?
Spring Boot MVC - 如何以编程方式生成实体的 etag 值?