来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
no-cache
如果no-cache指令未指定field-name,则缓存必须在与源服务器成功重新验证之前,不得使用响应来满足后续请求。这使得源服务器可以防止即使已配置为向客户端请求返回过时响应的缓存也无法缓存。
如果no-cache指令指定了一个或多个field-names,则缓存可以使用响应来满足后续请求,但受到缓存的任何其他限制。然而,指定的field-name(s)必须在未经源服务器成功重新验证的情况下,不得在响应中发送给后续请求。这允许源服务器防止在响应中重用某些头字段,同时仍允许缓存响应的其余部分。
除名称外,no-cache
不要求响应不能被缓存。它只指定缓存的响应必须在不重新验证的情况下不被重复使用以服务于后续请求,因此它是 must-revalidate, max-age=0
的速记形式。
浏览器将什么视为后续请求由浏览器决定,据我所知,使用后退按钮并不算。此行为因不同的浏览器引擎而异。
no-store
禁止对所有请求使用缓存的响应,而不仅仅是后续请求。
请注意,即使有 no-store
,RFC 实际上允许客户端将响应存储在历史记录缓冲区中以供使用。这意味着即使已指定 no-store
,客户端仍可以使用缓存的响应。
后面的行为涵盖了页面在浏览器历史记录中记录其原始页面标题的情况。另一个用例是各种移动浏览器的行为,这些浏览器在以下页面完全加载之前不会丢弃前一页,因为用户可能想要中止加载。
关于后退按钮的行为,需要澄清的是:根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.13,它不受任何缓存头的限制。
用户代理通常具有历史记录机制,例如“返回”按钮和历史记录列表,可以用于重新显示会话中先前检索到的实体。
历史记录机制和缓存是不同的。特别是,历史记录机制不应尝试显示资源当前状态的语义透明视图。相反,历史记录机制旨在显示用户在检索资源时所见到的内容。
默认情况下,历史记录机制不适用到期时间。如果实体仍然存储在其中,则历史记录机制应该显示它,即使实体已过期,除非用户已经特别配置了代理以刷新过期的历史文档。
这意味着当使用后退按钮时无视任何缓存控制标头是推荐的行为。如果您的浏览器恰好遵守了过期日期并应用no-store
指令不仅适用于浏览器缓存还适用于历史记录,那么它实际上已经偏离了该推荐行为。
如何解决:
您不能这样做,也不应该这样做。如果用户返回到先前访问的页面,大多数浏览器甚至会尝试还原视口。如果这是用户离开页面之前的原始行为,则可以使用延迟机制(如AJAX)刷新内容,但否则您甚至不应修改内容。
PUT
、PATCH
,都必须始终伴随着重新获取资源的GET
请求?以便历史机制可以在用户退出时恢复视图?这有点违背了缓存的目的,缓存的目的是减少请求。 - kakarukeys