https://www.web-tinker.com/article/21219.html
以前玩 http 的时候就是服务器到客户端,所以对 Cache-Control 的 public 和 private 的理解就只是在「浏览器如何处理」这个阶段,完全不懂规范中说的说为公开和私有缓存是什么概念。现在再重新读到规范的这部分,虽然规范还从前的规范,但感觉已经不同往日了。
首先,Web 并不是所谓「B/S 结构」那么简单的东西,那种说法已经古董级的了。一个较完整的 Web 架构都是一层层服务堆砌起来的,请求和响应都应该是「链」的概念。从浏览器到服务器的核心业务处理并不是一个请求过去就到的,中间可能还有好多层的代理来完成各种事情。
业务逻辑产生的内容,从缓存的角度看可以分为两类。一类是通用逻辑处理,比如获取「最新文章列表」这种所有用户都看到同样结果的业务;另一种则是私有业务处理,比如「猜你喜欢」这种每个用户看到的结果不同的业务。
中间层的代理服务器也会做一些缓存,但如果这些代理服务器部分青红皂白地就将所有内容都缓存下来那就会出问题。比如「猜你喜欢」是和用户有关的,如果中间层去缓存这类数据只会给服务器的存储空间增加负担。要是这个中间层采用内存级别的缓存,那么海量请求过来服务器内存可能分分钟被压爆。
所以我们才需要给内容的缓存分级,业务服务器响应结果时要告诉中间层的服务自己的内容是通用的还是私有的。这对应的就是 Cache-Control 的 public 和 private。中间层的代理服务器不应该把 private 的内容给缓存下来。
这当然不只是说说而已,主流的代理服务器还是有实现的。比如 nginx 的 http_upstream 模块就不会缓存标识为 private 的内容。HAProxy 也会忽略掉标识为 private 的内容,但 HAProxy 的实现明显要比 nginx 蠢得多。
网友评论