HTTP缓存

HTTP缓存

浏览器的 HHTP 缓存分为强缓存、协商缓存两种,当浏览器请求一个网站时,首先看有没有强缓存,如果命中强缓存,那就直接加载浏览器缓存,如果没有命中强缓存的话,就继续看有没有协商缓存,如果命中协商缓存的话,同样的也加载浏览器缓存的内容。

强缓存

判断是否命中强缓存主要是看返回包中的 expires 和 cache-control 字段,命中强缓存的时候状态码为 200,当浏览器第一次访问服务器是,会与服务器协商是否缓存这两个字段,如果缓存的话,浏览器下次请求的时候,主要就是看这两个字段。

Expires

这个字段的值为资源过期的绝对时间,浏览器收到一个含有 Expires 字段的返回包时,首先判断当前时间有没有超过这个绝对时间,如果没有超过这个绝对时间的话,那就命中强缓存,浏览器加载本地缓存资源

这个字段标识的时间是绝对时间,那么如果客户端的本地系统时间被更改的话,就导致浏览器与服务器的时间不同步,那么 Expires 的功能就会收到破坏

Cache-control

Cache-control 是为了解决 Expires 的缺点而增加的字段,与 Expires 不同 , Cache-control 表示的时间为相对时间,也就是说浏览器收到服务端回发的包,检查 Cache-control 的相对时间,比较上次缓存内容的时间,检查是否过期,不过期的话就加载缓存

协商缓存

当强缓存没命中的话,浏览器就开始判断有没有命中协商缓存,与协商缓存相关的头字段有 Last-Modify/If-Modify-Since 和 Etag/If-None-Match 两个组合,命中协商缓存的状态码为 304

Last-Modify/If-Modify-Since

当浏览器第一次请求服务器的时候,服务器会回发带有 Last-Modify 的字段的返回包,标记了服务器资源上一次修改的时间。后续浏览器向服务器发送请求时,就会带上 If-Modify-Since 字段,字段值为服务器上次回发的包中的 Last-Modify 字段的时间值,服务器收到请求对此时间,如果时间与服务器上次在修改这个资源的时间相同的话,那么就返回 304 状态,不回发资源,浏览器加载缓存。

可以看到,在上述过程中,以服务器的时间为判断依据,但是由于时间只能精确到秒,而一秒内文件可以被修改很多次,所以可能浏览器的资源发生了改变,但是时间却并没有改变,也有可能文件是定时生成的,但是内容没有改变,但是 Last-Modify 的时间改变了,导致不能使用缓存。

Etag/If-None-Match

这个组合的出现就是为了解决上述组合出现的问题。当浏览器第一次向服务器发出请求的时候,服务器回发给浏览器资源文件的 Etag 值,这个值唯一标识了文件,当文件发生改变时,Etag 值也会改变。此后,当客户端浏览器向服务器发送请求的时候就会加上 If-None-Match 字段,这个字段值就是上次收到的 Etag 值。服务器收到这个请求包就会判断 Etag 有没有发生变化,如果没有发生变化,就返回 304 状态, 浏览器就加载缓存内容。

如果这两个组合同时出现的话,Etag/If-None-Match 的优先级比较高。

https://www.cnblogs.com/ranyonsue/p/8918908.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值