我有一个简单的问题。我用谷歌搜索,但没有找到答案。
我有一个页面。我想要为页面内容禁用缓存。
是。我可以添加Cache-control指令,例如
Cache-Control: no-cache, no-store, must-revalidate, max-age: 0
但问题是:如果没有与Cache返回相关的HTTP标头,例如Cache-Control,Expires,Pragma,Last-Modified,......浏览器/代理是否曾在此缓存响应案件?如果是,何时?
谢谢!
答案 0 :(得分:2)
可以阻止符合RFC的客户端通过variety of instructions缓存页面。但是,就浏览器的历史而言,anything goes。
如果没有适合缓存验证的标头,那么中间人和客户都不应该认为响应是可缓存的:
缓存绝不能存储对任何请求的响应,除非响应是:
- 包含Expires标头字段或
- 包含max-age响应指令或
- 包含s-maxage响应指令,共享缓存或
- 包含允许缓存的Cache Control Extension或
- 的状态代码定义为cacheable by default或
- 包含public response directive
根据RFC 7231, section 6.1,默认情况下,状态代码被视为可缓存的漏洞可能是一个漏洞:
默认情况下定义为可缓存的状态代码的响应(例如,本规范中的200,203,204,206,300,301,404,405,410,414和501)可由具有缓存的缓存重用heuristic expiration除非方法定义或显式缓存控件另有说明
RFC 7234的链接部分故意含糊不清。我的阅读是缓存是根据他们可以找到的任何其他标头插入合理的到期时间。这可能很好地允许到期时间基于Set-Cookie
标头的参数。回到第3节,结束语通过陈述
[...]在正常操作中,某些缓存不会存储既没有缓存验证器也没有显式到期时间的响应,因为这样的响应通常不会用于存储。但是,不禁止缓存存储此类响应。
然而,浏览器可以随意提供其历史记录中的页面。从第6节开始:
freshness model不一定适用于历史机制。也就是说,历史机制即使已过期也可以显示先前的表示。
总之,中间人手头有许多自由来缓存没有明显缓存控制指令的响应。始终提供请求方法(例如GET
,HEAD
),响应代码(见上文)首先可缓存。浏览器的缓存应该像任何普通中介一样(实际上是这样),但在历史机制的上下文中,可以自由地故意忽略所有缓存机制(存在或不存在)并直接从其加载页面存储器中。