0

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

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

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

非常感谢

4

2 回答 2

1

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

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

无论哪种方式,您最好使用服务器的日期/时间值。事实上,HTTP 规范在第14.25节中确实如此说明:

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

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

于 2013-04-26T23:10:39.853 回答
0

如果客户端的时钟早于服务器的时钟,如果客户端请求修改自上次使用自己的时钟收到副本以来的文档,则客户端可能会错过任何更新。假设客户端时钟提前 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 后被修改。
  • 服务器回复,未修改。

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

于 2014-09-19T02:11:23.670 回答