gpt4 book ai didi

apache - 如何生成和配置 ETag?

转载 作者:行者123 更新时间:2023-11-28 22:48:44 26 4
gpt4 key购买 nike

我最近了解了 ETag HTTP header 的概念。 ( this ) 但我仍然有一个问题,对于负责生成 ETag 的特定 HTTP 资源?

换句话说,就是实际应用、容器(Ex:Tomcat)、Web Server/Load balancer(Ex:Apache/Nginx)?

有人可以帮忙吗?

最佳答案

Web 服务器中使用的典型算法概述。考虑我们有一个文件

  • 大小 1047,即十六进制的 417。
  • MTime 即最后一次修改时间为 2020 年 1 月 6 日星期一 12:54:56 GMT在 Unix 时间中是 1578315296 秒或 1578315296666771000 纳秒。
  • Inode 是一个物理文件号 66,即十六进制的 42

不同的网络服务器返回 ETag 如下:

  • Nginx:“5e132e20-417”“hex(MTime)-hex(Size)”。不可配置。
  • BusyBox httpd 与 Nginx 相同
  • > monkey httpd和Nginx一样
  • Apache/2.2:"42-417-59b782a99f493""hex(INode)-hex(Size)-hex(MTime in nanoseconds)"。可以configured但 MTime 无论如何都会以纳米为单位
  • Apache/2.4: "417-59b782a99f493""hex(Size)-hex(MTime in nanoseconds)" 即不带 INode,这有利于负载平衡相同的文件在不同的服务器上有不同的 INode。
  • OpenWrt uhttpd: "42-417-5e132e20""hex(INode)-hex(Size)-hex(MTime)"。不可配置。
  • Tomcat 9:W/"1047-1578315296666"Weak"Size-MTime in milliseconds"。这是 incorrect ETag因为它对于静态文件应该是强大的,即八进制兼容性。
  • LightHTTPD:"hashcode(42-1047-1578315296666771000)"INode-Size-MTime 但随后通过哈希码 (dekhash) 简化为一个简单的整数。可以配置但只能禁用一部分(etag.use-inode = "disabled")
  • MS IIS:它有一个形式 Filetimestamp:ChangeNumber例如“53dbd5819f62d61:0”。未记录,不可配置,但可以禁用。
  • Jetty:基于最后的模组、大小和散列。参见 Resource.getWeakETag()
  • Kitura(雨燕):“W/hex(Size)-hex(MTime)” StaticFileServer.calculateETag
  • JS 库 jshttp/etag "hex(Size)-hex(MTime)" stattag
  • H2O (C) “hex(MTime)-hex(Size)” h2o_filecache_get_etag

一些想法:

  • 这里经常使用十六进制数字,因为将十进制数字转换为较短的十六进制字符串的成本很低。
  • Inode 在添加更多保证的同时,如果您在应用程序重新部署期间简单地复制文件,则无法实现负载平衡并且非常脆弱。MTime(以纳秒为单位)并非在所有平台上都可用,因此不需要这种粒度。
  • Apache 有一个类似 https://bz.apache.org/bugzilla/show_bug.cgi?id=55573 的错误
  • MTime-SizeSize-MTime 的顺序也很重要,因为 MTime 更有可能发生变化,因此比较 ETag 字符串可能更快十几个 CPU 周期。
  • 即使这不是完整的校验和哈希,但绝对不是弱 ETag。这足以表明我们希望 Range 请求具有八进制兼容性。
  • Apache 和 Nginx 共享几乎所有互联网流量,但大多数静态文件通过 Nginx 共享,并且不可配置。

看起来 Nginx 使用了最合理的模式,所以如果你实现的话,尽量使它相同。一行C语言生成的整个ETag:

printf("\"%" PRIx64 "-%" PRIx64 "\"", last_mod, file_size)

我的建议是采用 Nginx 架构并将其作为 recommended ETag algorithm by W3C .

关于apache - 如何生成和配置 ETag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47512043/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com