Cache-Control:private,s-maxage = 0应该如何处理AJAX请求?

时间:2016-03-31 01:17:15

标签: http caching browser http-headers cache-control

如果页面以标题

回答
Cache-Control:private, s-maxage=0

页面是否应该被浏览器缓存?在这种情况下,规范行为是什么?

rfc2616定义了s-maxage:

  

如果响应包含s-maxage指令,则对于共享缓存(但不包括私有缓存),此指令指定的最大年龄将覆盖max-age指令或Expires头指定的最大年龄。 s-maxage指令还暗示了proxy-revalidate指令的语义(请参阅第14.9.4节),即共享缓存在变为陈旧以响应后续请求之后不得使用该条目,而不首先使用该条目重新验证它。原始服务器。私有缓存总是忽略s-maxage指令。

这让我有点困惑。我知道如果定义了max-age和s-maxage,s-maxage用于共享缓存,但私有(浏览器)缓存会发生什么? s-maxage是否仍由私有缓存使用?

我的测试表明Chrome 49和Firefox 44不会缓存此页面请求,而IE 11会有效地对此页面进行浏览器缓存(在win7 64位上进行测试)。此页面请求通过 AJAX 完成,以防万一。

所以你可以看到不同的浏览器有不同的行为。阅读规范似乎IE在这里是错误的。造成这种情况的根本原因是什么?也许是不同的默认值?

修改:进一步测试表明我的标题与Cache-Control:private的工作方式相同。

在这种情况下,Chrome从不使用浏览器缓存来支持普通'页面请求和AJAX GET请求,而IE 11没有缓存正常的页面请求缓存AJAX GET请求,没有明显的理由。

1 个答案:

答案 0 :(得分:0)

  

页面是否应该被浏览器缓存?

如您所知,浏览器应忽略s-maxage。来自the spec

  

“s-maxage”响应指令表示共享缓存中的 ,      此指令指定的最大年龄将覆盖最大年龄      由max-age指令或Expires头指定      字段。

同样,浏览器会忽略Cache-Control: private

  

“private”响应指令表示响应消息      适用于单个用户,不得由共享存储      高速缓存

具有私有缓存的浏览器应该忽略这两个指令;它们只适用于共享缓存。

因此,浏览器基本上忽略了标题;它应该启发式地缓存,就像没有Cache-Control标题的响应一样。