使用HTTP标头实现条件请求似乎有两种截然不同的方式,这两种方法都可以用于缓存,范围请求,并发控制等......:
在这两种情况下,客户端都会发送一条有关资源的信息,这使得服务器可以确定自客户端上次查看资源后资源是否已更改。然后,服务器根据客户端提供的条件头决定是否执行请求。
我不明白为什么有两种不同的方法可供使用。当然,ETags取代时间戳,因为服务器可以很容易地选择从时间戳生成ETag。
所以,我的问题是:
答案 0 :(得分:12)
我曾经思索过同样的事情,并意识到存在一个非常重要的区别:日期可以订购,ETag不能。
这意味着如果某些资源在一年前被修改过,但从那时起就没有,我们就知道了。然后,我们可以正确回答去年任意日期的If-Unmodified-Since请求,并同意确定...自该日期以来一直未经修改。
Etag只能与身份相媲美。它是相同的还是不相同的。如果您拥有与上述相同的资源,并且在一年中,docroot已移至新磁盘和文件系统,为所有文件提供新的inode但保留修改日期。有人将ETag基于文件的inode编号。然后我们不能说旧的ETag仍然没问题,没有过去仍然可以记录ETag的日志。
所以我不认为他们是另一个淘汰的人。它们适用于不同的情况。要么您可以轻松获得您要服务的页面中所有数据的最后修改日期,要么您可以轻松获得您将要服务的ETag。
如果您的动态网页包含来自大量数据库查找的数据,则可能很难判断上次修改日期是什么,而不会使您的数据库包含大量修改日期。但是你总是可以对结果呈现页面进行md5校验和。
当支持这些缓存协议时,我肯定只针对其中一个,而不是两者。
答案 1 :(得分:3)
有一个相当大的区别:如果我过去已经向服务器询问过,那么我只能使用ETag。时间戳,OTOH,我可以随着时间的推移弥补。
答案 2 :(得分:1)
简单的理由:向后兼容。