我正在开发一个新的 API。启用 ETags 后,Chrome 总是有条件地 GET 一个具有较长缓存生命周期的资源,即 Chrome 在没有先确认 ETag 的情况下不再使用缓存版本。
这是 ETags 应该如何与 GET 一起工作的吗?
如果是这样,并且考虑到我不需要它们来进行更新竞赛检查,我将删除 ETag 并减轻我的服务器正在做的额外工作。
编辑
我本来希望 Chrome 根据 max-age 使用缓存项,直到它过期,然后使用条件 GET 来更新其缓存项。
在我写这篇文章时,我现在意识到它无法“更新其缓存项”,因为 304 不包含用于延长到期时间的 max-age。
所以我猜在启用 ETags 的情况下,除非有充分的理由使用缓存版本,例如没有网络,否则客户端将始终有条件地获取。
因此,当不需要并发控制时,ETag 似乎会损害服务器性能。
编辑
我想我已经猜到了答案(上图),但简而言之就是这个问题:
当 ETags 被启用并且 Max-Age 在遥远的未来时,用户代理是否应该总是使用条件 GET 而不是使用以前缓存的新响应?