当Date和Expires值都在过去时,预期的缓存行为是什么



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

假设一个请求是在现在的时候发出的,假设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小时

但是,如果ExpiresDate值都是过去的,该怎么办。(可能是因为服务器时钟错误(。

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

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值通常足以触发no-cache,但Date值在过去会产生什么影响。

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

RFC2616日期部分
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.18
在过去的中未提及日期值

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

这两者似乎都没有提到DateExpires都已经过去的情况?

UPDATE/RFC2616已失效
进一步的阅读表明RFC2616已经过时,并且已经被一组更具体的RFC所取代。

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

如果存在Expires响应标头字段,请使用其值减去日期响应标题字段的值

这似乎正好指定了上面概述的内容——使用到期值:

expiry=(Expires - Date) + Now

在最初的RFC中似乎没有任何等价的语句。对于那些仍然遵循RFC2616的用户,行为是否取决于各个浏览器/缓存供应商?

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

最新更新