ETag 类似于 Last-Modified 标头。这是一种由客户端确定更改的机制。
ETag 必须是表示资源状态和特定格式的唯一值(资源可以有多种格式,每种格式都需要自己的 ETag)。在整个资源域中不是唯一的,只是在资源内。
现在,从技术上讲,与 Last-Modified 标头相比,ETag 具有“无限”分辨率。Last-Modified 仅以 1 秒的粒度更改,而 ETag 可以是亚秒级。
您可以同时实现 ETag 和 Last-Modified,或者仅实现其中一个(当然也可以不实现)。如果您的 Last-Modified 还不够,请考虑使用 ETag。
请注意,我不会为“每个”资源设置 ETag。基本上,我不会为任何不希望被缓存的东西(特别是动态内容)设置它。在这种情况下没有意义,只是浪费了工作。
编辑:我看到你的编辑,并澄清。
MD5 没问题。唯一的缺点是一直在计算 MD5。例如,在 200K PDF 文件上运行 MD5 是很昂贵的。在不期望被缓存的资源上运行 MD5 简直是浪费(即动态内容)。
诀窍很简单,无论您使用什么机制,它都应该像 Last-Modified 通常一样便宜。Last-Modified 通常是资源的一个属性,而且访问起来通常非常便宜。
ETags 应该同样便宜。如果您使用的是 MD5,并且您可以缓存/存储资源和 MD5 哈希之间的关联,那么这是一个很好的解决方案。但是,每次需要 ETag 时都重新计算 MD5,这基本上与使用 ETag 来提高整体服务器性能的想法背道而驰。