在“If-Modified-Since”HTTP 标头中使用客户端生成的时间

Posted

技术标签:

【中文标题】在“If-Modified-Since”HTTP 标头中使用客户端生成的时间【英文标题】:Using client generated time in the "If-Modified-Since" HTTP header 【发布时间】:2013-04-21 05:02:59 【问题描述】:

我们使用来自服务器的“Last-Modified”响应标头和“If-Modified-Since”请求标头进行资源验证。 HTTP 标头定义声明“If-Modified-Since”应该包含从服务器接收的值(它不禁止使用另一个值)。 在某个时候,我们开始使用“上次更新时间”作为客户端发送的“If-Modified-Since”的值。 “上次更新时间”是客户端上次从服务器收到更新的时间(资源的新版本或 304 错误)。我们被告知不能使用任何客户端生成的时间,因为可能存在时间同步问题。

当然,所有时间都以格林威治标准时间表示。

我无法确认这是一项要求。很高兴听到 espert 的意见,必须使用从服务器返回的值作为“If-Modified-Since”的值,还是有一定程度的灵活性?什么情况下可以使用客户端生成时间?

非常感谢

【问题讨论】:

【参考方案1】:

如果客户端的时钟早于服务器的时钟,则指定晚于服务器当前时钟的日期/时间是无效的(HTTP 规范甚至这样说)。

如果客户端的时钟落后于服务器时钟,那么至少您最终可能会收到 200 回复,而您可能会期待 304 回复,这不是错误,但会浪费带宽发送真正未经修改的资源。

无论哪种方式,您最好使用服务器的日期/时间值。事实上,HTTP 规范在14.25 部分确实这样说:

注意:在处理 If-Modified-Since 标头字段时,一些 服务器将使用精确的日期比较函数,而不是 小于函数,用于决定是否发送 304(不是 修改)响应。为了在发送 If- 时获得最佳结果 Modified-Since 用于缓存验证的头字段,客户端是 建议使用前一个 Last- 中收到的确切日期字符串 尽可能修改标题字段。

注意:如果客户端在 If-Modified-Since 中使用任意日期 标头而不是取自 Last-Modified 标头的日期 同样的请求,客户端应该知道这个事实 日期在服务器对时间的理解中被解释。这 客户应考虑不同步的时钟和舍入问题 由于客户端和客户端之间的时间编码不同 服务器。这包括竞争条件的可能性,如果 文件在第一次被请求和 后续请求的 If-Modified-Since 日期,以及 如果 If-Modified- 可能会出现与时钟偏差相关的问题 由于日期来自客户的时钟,没有更正 到服务器的时钟。不同时基的校正 由于网络,客户端和服务器之间的关系充其量是近似的 延迟。

【讨论】:

谢谢,很好的回答。因此,客户端应该更好地使用服务器端生成的时间,但是(如果它意识到问题)它可能违反规则。【参考方案2】:

如果客户端的时钟早于服务器的时钟,如果客户端要求修改自上次使用自己的时钟收到副本以来修改的文档,则客户端可能会错过任何更新。假设客户端时钟提前 5 秒。考虑一下这一系列事件:

在服务器时钟的 1:00:00,客户端时钟的 1:00:05,创建文档 X。 服务器时钟2:30:00,客户端时钟2:30:05,客户端请求获取文档X。 服务器发送带有 Last-Modified 标题为 1:00:00 的文档 X。 在服务器时钟的 2:30:03,文档 X 被修改。 3:30 左右,客户询问文档 X 是否在 2:30:05 后被修改。 服务器回复,未修改。

从服务器的角度来看,并不是客户端指定了未来的时间。问题是它不会得到一个小时前修改过的文档,因为它告诉服务器它已经有了它。

【讨论】:

以上是关于在“If-Modified-Since”HTTP 标头中使用客户端生成的时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 http 请求中传递“If-Modified-Since”?

HTTP的请求头标签 If-Modified-Since

HTTP 缓存 - 与服务器检查,始终发送 If-Modified-Since

HTTP协议中GET请求方法中的请求头内容 : If-Modified-Since

了解 If-Modified-Since HTTP 标头

imageresizer if-modified-since 支持