12

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

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

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

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

所以,我的问题是:

  • 在哪些情况下,您可能更喜欢 If-Unmodified-Since/If-Modified-Since 而不是 ETags?
  • 在哪些情况下您可能需要两者?
4

3 回答 3

14

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

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

Etag 仅在身份方面具有可比性。要么相同,要么不同。如果您拥有与上述相同的资源,并且在这一年中 docroot 已移动到新的磁盘和文件系统,则为所有文件提供新的 inode,但保留修改日期。有人将 ETags 基于文件的 inode 号。那么我们不能说旧的 ETag 仍然可以,没有过去仍然可以的 ETag 的日志。

所以我不认为它们是一个过时的另一个。它们适用于不同的情况。您可以轻松地获取您将要服务的页面中所有数据的 Last-Modified 日期,或者您可以轻松地获取您将要服务的内容的 ETag。

如果您有一个动态网页,其中包含来自大量数据库查找的数据,那么在不使您的数据库包含大量修改日期的情况下,可能很难判断 Last-Modified 日期是什么。但是您始终可以对结果呈现页面进行 md5 校验和。

当支持这些缓存协议时,我肯定只选择其中一个,从不两者兼而有之。

于 2010-01-24T12:47:28.477 回答
3

有一个相当大的区别:如果我过去已经向服务器请求了一个,我只能使用 ETags。时间戳,OTOH,我可以随时弥补。

于 2010-01-25T04:24:08.450 回答
1

原因很简单:向后兼容。

于 2010-01-24T11:22:43.767 回答