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

rew*_*wbs 12 rest etag http http-headers if-modified-since

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

  1. If-Unmodified-Since和If-Modified-Since,客户端发送资源的时间戳.
  2. If-Modified和If-None-Modified,客户端发送资源的ETag表示.

在这两种情况下,客户端都会发送一条有关资源的信息,这使得服务器可以确定自客户端上次查看资源后资源是否已更改.然后,服务器根据客户端提供的条件头决定是否执行请求.

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

所以,我的问题是:

  • 在哪些情况下你可能喜欢If-Unmodified-Since/If-Modified-Since over ETags?
  • 在哪些情况下你可能需要两者?

Chr*_*ian 12

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

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

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

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

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

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

  • 您需要将代理添加到等式中.如果你的Etag值具有语义含义,那么他们现在就不会这样了. (4认同)