如何生成 HTTP 响应头中的 ETag 值?

HTTP 响应头中的 ETag 值是通过服务器端基于内容、元数据或版本号等多种方式生成,用于缓存验证和资源更新判断。

网络协议 中等 HTTP 缓存 ETag

ETag(实体标签)是一个唯一标识资源版本的字符串,由服务器在 HTTP 响应头中生成。它主要用于缓存验证(如与If-None-Match请求头配合使用),确保客户端能有效判断资源是否已更新。生成方式灵活多样,具体取决于服务器实现,常见的生成方法包括:

  • 基于内容的哈希计算:服务器使用哈希算法(如 MD5、SHA-1 或 SHA-256)直接计算资源内容(例如文件数据)的摘要值,生成唯一的 ETag 字符串。这确保了内容修改时 ETag 自动变化,但可能消耗较高的计算资源。
  • 基于元数据组合:结合资源的元属性生成 ETag,如文件的最后修改时间和内容长度通过特定逻辑结合(例如,在 Nginx 服务器中常采用时间戳和字节数组合的方式)。这种方法成本较低、适合高并发场景。
  • 版本号或自定义标识:用内部资源版本号、时间戳或唯一标识符(如 GUID)作为 ETag。这种方式允许服务器自定义逻辑,在资源关键属性变化(如数据库记录更新)时触发 ETag 更新。

ETag 生成没有严格标准(由 HTTP/1.1 协议规定服务端定义行为),任何可靠方法均可用于 ETag 的创建。服务需确保 ETag 唯一性与可变性:资源未修改时 ETag 一致,修改后必须更新以验证新旧内容状态。