Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

关于默认缓存策略

  在 http 响应头中可以通过 Cache-Control 来设置缓存,但也可以不设置。大家都知道不设置 Cache-Control 就使用浏览器自己的缓存策略,然而浏览器自带的缓存策略到底是什么呢?网络上很多文章说 Cache-Control 的默认值是 private,但实际好像并没那么简单。
  如果是浏览器,在处理 2xx 请求时确实喜欢用 private,但这并不是规范的。一些代理服务器,比如 nginx 的 upstream 模块默认就会使用 public(其实也不是显式声明使用 public,而是它的逻辑是判断有没有 private 关键字之类的,没有就默认缓存下拉i)。然而这些都只是成功的 2xx 请求。
  以前 debug 微信嵌入的业务时,由于微信的缓存有点丧心病狂,所以我把页面的响应状态码全都改成 500 来 debug。也就是说,当页面发送一个错误状态码时,浏览器可能不会做缓存。我觉得这个行为也是有理有据的是,因为错误可能只是由于服务临时产生的,只是一种偶尔的状态,不该被缓存。比如 404 之类的状态码只是表示当前没有资源,并不代表以后都没有。
  既然扯到了「临时」的概念和「并不代表以后都没有」的情况,那就联想到了两个状态码。301 是「永久」重定向,和「临时」是相反的;而 410 是「曾经有,现在和以后都没有了。这两个状态码在语义上就是「永久」的,所以一些浏览器对它们的处理方式也是默认开启缓存,比如 webkit 的代码里就有这么一坨这样的代码,所以在开发过程中经常有人遇到顽固缓存的情况,那多半就是 301 被默认缓存了。
  然而我并没有找到 301 和 410 这两个状态码必须缓存的规范,也就是说这应该是浏览器行为(也可能是我漏过了什么规范吧,要是不对请纠正)。所以并没有什么通用的默认缓存策略,都是浏览器行为而已。
网名:
54.146.176.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^