Nginx 默认为哪些静态文件类型生成 ETag?

Nginx 默认为哪些静态文件类型生成 ETag?

在 Nginx 的现代版本中,ETag 是自动生成对于静态文件类型,即使您没有etag on在位置块中特别启用或以其他方式:

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

例如,即使您未手动启用它们,Nginx 提供的 PNG 或 JPEG 文件也会自动在未进行 gzip 压缩的静态文件中包含content-lengthlast-modified和的 HTTP 标头……etag

但是,Nginx 默认对哪些文件类型执行此操作?当我通过.html在静态文件位置块中包含文件扩展名并手动添加etag on到所有“静态”文件类型(包括.html文件,即使它们通常不被视为静态)来测试这一点时,Nginx 删除了etag我的.html文件的 HTTP 标头(即使它在位置块中是硬编码启用的),但没有删除其他文件类型,例如 PNG 或 JPEG。

更新:是 Cloudflare 删除了etag我的 .html 文件的标头,而不是 Nginx。但是,content-length当在某些文件类型上启用 gzip 时,Nginx 会删除标头。更令人困惑的是,Cloudflare 会自动对某些内容添加 gzip。

我没有看到有关此内容的任何文档...Nginx 会自动为哪些文件类型启用 ETag,以及 Nginx 默认会忽略/删除哪些文件类型的 ETag?

编辑:这些与 gzip 相关的讨论可能相关:

https://javorszky.co.uk/2019/03/28/etag-if-match-nginx-and-you/

https://forum.nginx.org/read.php?2,286645,286645#msg-286645

https://forum.nginx.org/read.php?2,240120,240120#msg-240120

https://stackoverflow.com/questions/55305687/how-to-address-weak-etags-conversion-by-nginx-on-gzip-compression

TIL,Nginx 在对上游响应进行 gzip 压缩以使用“Accept-Encoding: gzip”时会从上游响应中删除弱 ETag。谢谢,互联网。

https://twitter.com/tomstuart/status/367994690517225472

答案1

我发现,如果您的服务器启用了 gzip, Nginx 会content-length从某些文件类型(例如我的文件)中删除标头。但是,除非您使用 Cloudflare,否则标头似乎会保持完整,因为 Cloudflare 会从某些内容中删除标头。.htmletagetag

更令人困惑的是,即使 Nginx 已禁用 gzip,Cloudflare 也会将 gzip 添加到某些内容中,例如 HTML 或动态内容等。

现在我仍然感到困惑,因为我的理解是 Nginx 根据content-lengthlast-modified标头生成 ETag,所以我不知道etag标头如何保留在已被 Nginx gzip 压缩的 .html 或 .js 或 .css 文件上,因为content-length在这种情况下由于启用了 gzip 而被 Nginx 剥离...

根据一个家伙,使用静态 gzip 可以解决这个content-length困境,但对于那些不想使用静态 gzip 的人来说,这又是一个挑战。

但回到主要问题,Nginx 默认为哪些文件类型生成 Etag?... 好吧,我仍然不确定这个问题的答案,但我猜也许 Nginx 会为磁盘上任何具有时间戳last-modified和静态content-length值的文件生成 ETag... 即使 Nginx 因 gzip 而删除content-length。是的,我也不明白。

相关内容