在 Nginx 的现代版本中,ETag 是自动生成对于静态文件类型,即使您没有etag on
在位置块中特别启用或以其他方式:
https://nginx.org/en/docs/http/ngx_http_core_module.html#etag
例如,即使您未手动启用它们,Nginx 提供的 PNG 或 JPEG 文件也会自动在未进行 gzip 压缩的静态文件中包含content-length
、last-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
TIL,Nginx 在对上游响应进行 gzip 压缩以使用“Accept-Encoding: gzip”时会从上游响应中删除弱 ETag。谢谢,互联网。
答案1
我发现,如果您的服务器启用了 gzip, Nginx 会content-length
从某些文件类型(例如我的文件)中删除标头。但是,除非您使用 Cloudflare,否则标头似乎会保持完整,因为 Cloudflare 会从某些内容中删除标头。.html
etag
etag
更令人困惑的是,即使 Nginx 已禁用 gzip,Cloudflare 也会将 gzip 添加到某些内容中,例如 HTML 或动态内容等。
现在我仍然感到困惑,因为我的理解是 Nginx 根据content-length
和last-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
。是的,我也不明白。