在响应标头中指定缓存行为的一个相当标准的方法是设置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小时。
但是,如果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
值通常足以触发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
,则响应"已过期">。
这两者似乎都没有提到Date
和Expires
都已经过去的情况?
UPDATE/RFC2616已失效
进一步的阅读表明RFC2616已经过时,并且已经被一组更具体的RFC所取代。
新的RFC7234-HTTP/1.1:缓存包含一个计算新鲜度生存期,其中包含以下语句:
如果存在Expires响应标头字段,请使用其值减去日期响应标题字段的值
这似乎正好指定了上面概述的内容——使用到期值:
expiry=(Expires - Date) + Now
在最初的RFC中似乎没有任何等价的语句。对于那些仍然遵循RFC2616的用户,行为是否取决于各个浏览器/缓存供应商?
2616中,相应的部分是13.2.3年龄计算。