如果一个页面用页眉回答
Cache-Control:private, s-maxage=0
页面是否应该被浏览器缓存?在这种情况下,规范行为是什么?
RFC2616定义S-Maxage具有:
如果响应包含S- Max的指令,那么对于共享缓存(而不是针对私有缓存),由该指令指定的最大年龄覆盖最大年龄指令或ExExcel报头指定的最大年龄。s-maxage指令还暗示了proxy revalidate指令的语义(参见第14.9.4节),即共享缓存在过期后不能使用该条目来响应后续请求,而不必首先使用源服务器对其进行重新验证。s-maxage指令总是被私有缓存忽略。
这让我有点困惑。我知道,如果定义了max age和s-maxage,则s-maxage用于共享缓存,但是私有(浏览器)缓存会发生什么情况?s-maxage是否仍由私有缓存使用?
我的测试表明chrome 49和firefox 44不会缓存这个页面请求,而ie 11会有效地缓存这个页面(win7 64bit上的测试)。如果重要的话,这个页面请求是通过ajax完成的。
所以你可以看到不同的浏览器有不同的行为。看了说明书,这里好像不对。这件事的根本原因是什么?可能不同的默认值?
编辑:进一步的测试告诉我,我的头的工作方式与
Cache-Control:private
相同。在这种情况下,chrome从来不会对“普通”页面请求和ajax get请求同时使用浏览器缓存,而ie 11没有缓存普通页面请求,而是缓存ajaxget请求,这显然是没有充分理由的。
最佳答案
页面是否应该被浏览器缓存?
正如您所建议的,浏览器应该忽略s-maxage
。从the spec:
“s-maxage”响应指令表示,在共享缓存中,
此指令指定的最大年龄超过最大年龄。
由max age指令或expires头指定
字段。
同样,浏览器忽略Cache-Control: private
:
“private”响应指令指示响应消息
是为单个用户设计的,不能由共享的
隐藏物。
具有专用缓存的浏览器应忽略这两个指令;它们仅适用于共享缓存。
因此,头部基本上被浏览器忽略;它应该像一个根本没有Cache-Control
头部的响应一样进行启发式缓存。