Cache-Control: private,s-maxage = 0在AJAX请求中应如何表现?

3
如果一个页面回应了头部信息
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个回答

2
如果网页被浏览器缓存,是否应该被缓存?正如你所建议的那样,浏览器应该忽略“s-maxage”。来自规范的说明如下:
“s-maxage”响应指令表示,在共享缓存中,此指令指定的最大年龄将覆盖max-age指令或Expires头字段指定的最大年龄。
同样,浏览器会忽略Cache-Control: private
“private”响应指令表示,响应消息仅适用于单个用户,不得由共享缓存存储。
具有私有缓存的浏览器应忽略这两个指令;它们仅适用于共享缓存。因此,浏览器基本上会忽略头文件;它应该像没有Cache-Control头文件的响应一样启发式地缓存。

你的意思是 同样,共享缓存会忽略 Cache-Control: private: 吗? - Kim
@Kim 不,浏览器通常有一个私有缓存,并忽略仅适用于共享缓存的任何要求。 - Joe
我觉得措辞有问题,不是吗?浏览器缓存Cache-Control:private,共享缓存则不会(所以它们会忽略)Cache-Control:private。 - Kim
@kim“忽略Cache-Control: private”的意思是“在考虑是否缓存响应时忽略该指令”。你可能将“忽略”解释为“不缓存包含该指令的响应”?这不是我的意图。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接