HTTP Cache-Control:No-cache反而意味有缓存 - httptoolkit


HTTP是从前端到后端再到移动的现代发展的基础。当您仔细观察时,HTTP充满了奇怪的角落和奇怪的细节。
 
No-cache反而意味有缓存
缓存从来都不是一件容易的事,但是HTTP缓存头可能会特别令人困惑。最糟糕的例子是no-cache和private。下面的响应标头有什么作用?
Cache-Control: private, no-cache
看起来这意味着“不要在任何地方存储此响应”,对吗?
哈哈哈,不是。
实际上,这意味着“请将该响应存储在所有浏览器缓存中,但在使用时对其进行重新验证”。实际上,这使响应更加可缓存,这甚至适用于默认情况下通常不可缓存的响应。
具体来说,这no-cache意味着您的内容是显式可缓存的,但是无论何时浏览器或CDN要使用它,他们都应使用If-Match或If-Modified-Since向服务器发送请求,以先询问缓存是否仍是最新的。同时private意味着该内容是可缓存的,但只能在最终客户端浏览器中,而不能在CDN或代理中。
如果您由于响应包含不应该存储在其他地方的安全性或隐私敏感数据而试图禁用缓存,那么您现在就遇到了大麻烦。实际上,您可能想要no-store。
如果您发送包含Cache-Control: no-store标头的响应,则没人会缓存该响应,并且每次都会从服务器中获得新的响应。
唯一的极端情况是,如果客户端已经具有缓存的响应时发送该消息,则该消息将不会被删除。如果要执行此操作并清除现有缓存,请添加max-age=0。
Twitter特别是解决了这个问题。他们使用了Pragma: no-cache(与Cache-Control: no-store是同一标头的旧版本)。意外地将每个用户的私人直接消息保留在浏览器缓存中。如果您共享一台计算机,或者在某处的公用计算机上使用Twitter,则现在您所有的私人消息都可以方便地在硬盘驱动器上进行解密和读取了。