如果一个页面回应了头部信息
页面是否应由浏览器缓存?在这种情况下,规范的行为是什么?
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请求,原因不明。
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请求,原因不明。
同样,共享缓存会忽略 Cache-Control: private:
吗? - KimCache-Control: private
”的意思是“在考虑是否缓存响应时忽略该指令”。你可能将“忽略”解释为“不缓存包含该指令的响应”?这不是我的意图。 - Joe