携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 >>
前言
HTTP缓存分为两种,分别为强缓存和协商缓存,可以加快资源获取时间,提升用户体验。
强缓存
当浏览器首次请求服务器资源时,服务端会在响应体中返回缓存时间,当浏览器第二次请求相同资源时,如果缓存时间未过期,那么将直接从缓存中获取资源,不会向服务端发起请求。主要由Expires和Cache-control来控制。其中Cache-control的优先级高于Expires.
1.Expires
响应头 表示资源过期时间。绝对时间,在这个时间之前不会再次请求服务器资源,即使服务器上资源更新后,浏览器也获取不到最新资源。时间到了之后,即使服务器上的资源没有更新,也会读取资源,返回给浏览器
cache-control
请求头/响应头中都可以使用,表示缓存控制方式字段:
1.no-cache 表示不使用强缓存,可以使用协商缓存、
2.no-store 表示禁止使用缓存、
3.public 表示可以被代理服务器缓存、CDN缓存、
4.private 表示只能在浏览器缓存,不能被中间商缓存、
5.max-age=xxx 表示缓存过期时间,相对时间单位秒,从发起请求时间开始计算相对时间、时间到了以后,不管有没 有修改们都会再次发起请求。
Cache-Control的优先级高于expires.
协商缓存
当浏览器强缓存失效或者请求设置Cache-control为no-cache的时候,可以使用协商缓存。分别由两对字段控制:If-Modified-Sincee/Last-Modified、If-None-Match/Etag。
If-Modified-Since:
请求头中定义,表示资源最后修改时间,浏览器->服务器,与Last-Modified对应。如果匹配上,则不会请求,直接从缓存获取,如果匹配不上,则请求服务器,服务器返回的响应头中会修改 Last-Modified
Last-Modified:
响应头,表示最近修改时间, 服务器->浏览器, 与If-Modified-Since对应。
缓存过期后,服务器上资源没更新,不会把资源发送给浏览器,更新了才发送
精确度为s,如果修改过于频繁,小于1s,会检测不到
If-None-Match:
请求头,唯一标记,浏览器->服务器,如果匹配成功,则直接从缓存中获取,匹配步成功,再请求服务器,并修改返回的Etag.
Etag:
响应头,服务器生成的文件唯一标识,服务器->浏览器 与If-None-Match对应,如果匹配上,则不请求。如果匹配不上,则请求,并修改 If-None-Match,If-None-Match 优先级高于If-Modified-Since
组合使用
浏览器请求服务器时带上max-age、If-Modified-Since、和If-None-Match,max-age之内,直接使用缓存,超出后请求服务器,如果If-Modified-Since匹配上,使用缓存,匹配不上再判断If-None-Match,匹配上使用缓存,匹配不上再请求服务器。