在响应头中指定缓存行为的一种相当标准的方法是同时设置一个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 的人,行为是否取决于各个浏览器/缓存供应商?