肉烂在锅里

个人站

我是软件研发中心培训主管,我喜欢看动漫,学习web前端开发。


CacheControl的含义和使用

public & private & no-cache

众所周知,在http请求返回的过程中会经过我们的浏览器,以及众多的代理服务器。

  • public的意思也就是在任何一个节点都可以对数据进行缓存,缓存可以来自于浏览器自身,也可以是其中的某个代理服务器。

  • private:就仅限于在我们的浏览器使用缓存。

  • no-cache: 可以在本地或代理服务器使用缓存,但是需要去原服务器端进行验证,在原服务验证未过期后,继续使用缓存。

到期时间

  • max-age = <seconds> max-age是专门为我们浏览器所设置的在max-age所设置的时间内,资源不会被浏览器重新请求,而是直接使用本地缓存。

  • s-maxage = <seconds> 和max-age的功能是类似的,不同点在于s-maxage是对代理服务器而言的,而max-age是对浏览器而言的,当我们同时设置了s-maxage,和max-age,浏览器会先根据max-age来判断是否应该发起请求,在发起请求后,s-maxage就会被服务器读取,在s-maxage的过期时间内,代理服务器就会直接返回缓存中的数据

  • max-stale : 即使max-age过期,在max-stale的时间内,浏览器还是会使用缓存。

重新验证

Must-revalidate: 对浏览器而言,在max-age到期之后,必须去原服务器再起请求数据。

Proxy-revalidate:对缓存服务器而言,在s-maxage到期之后,必须去原服务器再次请求数据。

No-store: 注意和no-cache的区别,no-store是永远不使用缓存。

No-transform: 有一些proxy服务器会改变资源,比如他认为我们需要请求的数据太大了,就自动的帮忙压缩,no-transform的含义就是告诉proxy服务器,不要进行额外的处理。

cache-control: max-age实验现场

  1. 先起一个简单的服务器

  1. 在index.js中访问/script.js,同时返回脚本

  1. 访问8888,查看network

可以看到node服务器成功的返回了脚本,但是多次刷新浏览器后,我们依旧可以看到同样的信息,返回的状态码仍为200,且依旧是通过请求的方式,而不是from memory cache。

  1. 设置max-age

设置max-age为20,在20s之内,缓存有效。

首先初次请求

在20s内立刻刷新页面,可见此次script.js请求根本就没发送到服务端,直接from memory cache且状态码为200(。值得注意的是,Time为0,说明了资源拿取的效率可能在ms级以下了,好处不言而喻!

TIP:

因为没有经过服务端,所以浏览器在从缓存中得到资源后自动返回200,而不是304!状态码304相当于服务端告知浏览器去读取缓存,浏览器不会因为资源是从缓存中读取的就自动返回304!)

20s后,再次刷新页面,可以发现,资源又被重新请求:

但是这也暴露出了一个缺点:服务端的返回的内容改变,但是还在缓存时间内,浏览器依旧会使用本地的缓存资源。他生不知资源已经过期了。

为了验证这一点,我们首先延长过期时间至2000s,然后重启服务器,并刷新浏览器,获取第一次的请求资源后,改变node返回的js脚本内容(多一个’twice’字样)。此时不刷新浏览器也不清除浏览器的本地缓存,重启服务器后直接刷新浏览器。

可以发现此次的浏览器依旧读取的缓存:

在打印的内容中也可以看出,浏览器依旧使用了过期的本地缓存:

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦