用了CDN缓存,就会跳过强缓存和协商缓存吗?

用了CDN缓存,就会跳过强缓存和协商缓存吗?

看了一下浏览器缓存,强缓存、协商缓存、CDN缓存。但他们的关系我有点迷糊。开启了用了CDN缓存,还会用到判断强缓存和协商缓存吗?大神们?
阅读 5.9k
3 个回答

附一张图
https://segmentfault.com/img/...
clipboard.png

强缓存是直接使用本地缓存(根据Expires或者Cache-Control来判断),命中后直接从本地返回。没命中的话,带着Last-Modified或Etag和服务器确认,在确认的网络传输过程中可能会经过CDN服务器,CDN服务器如果本地有缓存,可以根据资源情况返回304(资源有效)或者200(客户端资源无效,返回CDN服务器本地资源),这个和终端服务器的逻辑是一致的。

Cache-Control中有两个属性和CDN服务器有关,

  • public,代表可以被所有终端缓存,包括CDN服务器
  • private,只能被终端浏览器缓存,CDN服务器等中继服务器不能缓存。

这3个概念并不冲突,强缓存是本地缓存,有效期内直接使用,失效后要去服务器验证下(就是你说的协商缓存),协商过程中可能经过CDN服务器,就出来了CDN缓存。所以无论你开不开CDN缓存,都不影响强缓存和协商缓存的逻辑

这个问题吧,我说点儿自己的理解,可能不是特别准确,但是希望对你有帮助。

简单讲的话,这个 CDN 缓存与强缓存和协商缓存本身是两码事。强缓存和协商缓存是指浏览器在加载一个静态资源时,决定缓存是否命中的策略类型,一般的过程如下:

  • 首先根据资源的 http header 来判定它是否命中强缓存,如果命中的话,请求是不会发送到服务器的,直接使用本地缓存即可
  • 如果强缓存没命中,则一定会发送请求去服务器进行确认,这里就是协商缓存了,协商的过程会根据服务器的配置、请求发送的 http header 等信息来判定是否命中协商缓存,如果命中,浏览器还是会直接使用本地缓存的

而 CDN 缓存加速的原理是因为它会把资源缓存在节点上,这样访问某个资源时,直接访问 CDN 节点即可,不需要直接访问源站。你问题中指的是否跳过强缓存和协商缓存,这个是要看配置的。一般配置 CDN 的话,肯定都有管理控制台让你填一些参数的,比如内容、过期时间、权重等等,这些参数的意义在于,浏览器与 CDN 节点交互的时候,会根据这些参数以及你源站的配置来决定是直接返回缓存资源,还是将这个请求转发至源站(具体规则很复杂,你可以上网找文章详细了解一下),以让源站来决定返回什么样的资源,其中的过程也会包含上面一段所描述的强缓存与协商缓存的解析过程。

以上,个人拙见,大神轻喷。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏