浏览器缓存知识
- 0
#讨论区
00条评论
实时对话
loading...
浏览器缓存分强缓存和协商缓存
不会向服务器发送请求,从缓存中读取资源,返回的状态码是200 如果响应头有expires、pragma或者cache-control字段,代表这是强缓存
Expires
HTTP/1.0 时间不准Cache-Control
HTTP/1.1Cache-Control
优先级高,覆盖Expires
Cache-Control
设置no-cache
开启协商缓存协商缓存就是强缓存失效后,浏览器携带缓存标识向服务器发送请求,由服务器根据缓存标识来决定是否使用缓存的过程。
Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)。
If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200。
Last-Modifed缺点:
服务器优先验证Etag,若一致,继续比对Last-Modifed,最后判断是否返回304
Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效。
可以这样设置来使用协商缓存
javascript
If-None-Match
If-Modified-Since
使用koa模拟 https://github.com/zzfn/koa-server/blob/main/routes/cache.js
javascript
ctx.set('Cache-Control', 'public, max-age=0');
ctx.set('Last-Modified', xxx);
ctx.set('ETag', xxx);
const Router = require('koa-router')
const router = new Router({prefix: '/cache'})
module.exports = router
router.get('/Expired', async ctx => {
// ctx.response.lastModified = new Date();
const Expired=new Date(new Date().getTime()+10000).toUTCString()
ctx.set('Expires',Expired)
ctx.body={
now:new Date().toUTCString(),
Expired
}
})
router.get('/cache-control', async ctx => {
// ctx.response.lastModified = new Date();
const Expired=new Date(new Date().getTime()+10000).toUTCString()
ctx.set('Cache-Control','max-age=10')
ctx.body={
now:new Date().toUTCString(),
Expired
}
})
router.get('/etag', async ctx => {
console.log(1)
// ctx.response.lastModified = new Date();
const Expired=new Date(new Date().getTime()+10000).toUTCString()
ctx.set('Etag','1123')
ctx.status = 304;
ctx.body={
a:1,
now:new Date().toUTCString(),
Expired
}
})
router.get('/Last-Modified', async ctx => {
// ctx.response.lastModified = new Date();
const Expired=new Date(new Date().getTime()+10000).toUTCString()
ctx.set('Cache-Control','max-age=10')
ctx.body={
now:new Date().toUTCString(),
Expired
}
})
module.exports = router