If-Unmodified-Since / If-Modified-Since有什么意义?他们不是被ETags取代了吗?

时间:2010-01-24 11:18:55

标签: http rest http-headers etag if-modified-since

使用HTTP标头实现条件请求似乎有两种截然不同的方式,这两种方法都可以用于缓存,范围请求,并发控制等......:

  1. If-Unmodified-Since和If-Modified-Since ,客户端发送资源的时间戳
  2. If-Modified和If-None-Modified ,客户端发送资源的 ETag 表示。
  3. 在这两种情况下,客户端都会发送一条有关资源的信息,这使得服务器可以确定自客户端上次查看资源后资源是否已更改。然后,服务器根据客户端提供的条件头决定是否执行请求。

    我不明白为什么有两种不同的方法可供使用。当然,ETags取代时间戳,因为服务器可以很容易地选择从时间戳生成ETag。

    所以,我的问题是:

    • 在哪些情况下你可能会喜欢If-Unmodified-Since / If-Modified-since over ETags?
    • 您可能需要两种场景吗?

3 个答案:

答案 0 :(得分:12)

我曾经思索过同样的事情,并意识到存在一个非常重要的区别:日期可以订购,ETag不能。

这意味着如果某些资源在一年前被修改过,但从那时起就没有,我们就知道了。然后,我们可以正确回答去年任意日期的If-Unmodified-Since请求,并同意确定...自该日期以来一直未经修改。

Etag只能与身份相媲美。它是相同的还是不相同的。如果您拥有与上述相同的资源,并且在一年中,docroot已移至新磁盘和文件系统,为所有文件提供新的inode但保留修改日期。有人将ETag基于文件的inode编号。然后我们不能说旧的ETag仍然没问题,没有过去仍然可以记录ETag的日志。

所以我不认为他们是另一个淘汰的人。它们适用于不同的情况。要么您可以轻松获得您要服务的页面中所有数据的最后修改日期,要么您可以轻松获得您将要服务的ETag。

如果您的动态网页包含来自大量数据库查找的数据,则可能很难判断上次修改日期是什么,而不会使您的数据库包含大量修改日期。但是你总是可以对结果呈现页面进行md5校验和。

当支持这些缓存协议时,我肯定只针对其中一个,而不是两者。

答案 1 :(得分:3)

有一个相当大的区别:如果我过去已经向服务器询问过,那么我只能使用ETag。时间戳,OTOH,我可以随着时间的推移弥补。

答案 2 :(得分:1)

简单的理由:向后兼容。