1

在响应头中指定缓存行为的一种相当标准的方法是同时设置一个Date值和一个Expires值。(以及某种缓存控制指令,例如cache-control=public)。

假设在 time now发出请求,假设now是:

Tue, 24 Jun 2014 13:36:05 GMT

然后,将缓存值设置为 1 小时的标准响应可能包含以下标头:

Date: Tue, 24 Jun 2014 13:36:05 GMT
Expires: Tue, 24 Jun 2014 14:36:05 GMT

这将(并且应该)告诉任何中间缓存或 PoP 从现在起将资源缓存 1 小时。

但是,如果Expires值都在Date过去怎么办。(也许,比如说,因为错误的服务器时钟)。

如果我们考虑同时提出另一个请求,现在是:

Tue, 24 Jun 2014 13:36:05 GMT

如果相应的响应包含以下标头值怎么办:

Date: Tue, 24 Jun 2014 11:10:00 GMT
Expires: Tue, 24 Jun 2014 11:44:00 GMT

在这里,这两个值都已经过去了。过去的Expires值通常足以触发 a no-cache,但是Date过去的值的影响是什么。

缓存实现是否应该使用 的值Date来计算偏移量Expires,然后使用它来创建now + offset的到期值?

RFC2616 日期部分
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
过去没有提到日期值

RFC2616 Expires 部分
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21
规定如果Date === Expires,则响应“已经过期”

这些似乎都没有提到两者都已经过去的Date情况Expires

更新 / RFC2616 已死
进一步阅读表明RFC2616 已死,并已被一组更具体的 RFC 取代。

新的RFC7234 - HTTP/1.1:缓存包含计算新鲜度生命周期,其中包含以下语句:

如果存在 Expires 响应头字段,则使用其值减去 Date 响应头字段的值

这似乎准确地指定了上面概述的内容 - 使用 expires 值:

expiry=(Expires - Date) + Now

原始 RFC 中似乎没有任何等效声明。对于那些仍然遵循 RFC2616 的人,行为是否取决于各个浏览器/缓存供应商?

4

1 回答 1

1

在 2616 中,对应的部分是 13.2.3 年龄计算。

于 2014-06-25T03:19:04.783 回答