如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

你知道 http 响应头中的 ETag 是如何生成的吗

如何在 IIS 上为 text/html 页面使用 eTag

如何根据返回的 etag 使用 curl 缓存 api 响应?

Spring Boot MVC - 如何以编程方式生成实体的 etag 值?

如果 ETag 不匹配,如何使用 ETag 在插入时抛出异常(除非它是 *)

如何配置电子标签?