3-5 缓存验证Last-Modified和Etag的使用
2018-12-04 本文已影响0人
伯纳乌的追风少年
当服务端设置了Cache-Control值为no-cache时,当浏览器发起请求时,都需要到服务端进行资源的验证。验证完成后如果确定服务端可以使用缓存,才会读取本地的缓存。
![](https://img.haomeiwen.com/i5982160/1c1501d3817081ad.png)
last-Modified
![](https://img.haomeiwen.com/i5982160/879d03b91e094689.png)
Etag
![](https://img.haomeiwen.com/i5982160/bf71db16c5ad02ea.png)
demo
const http=require('http');
const fs=require('fs')
http.createServer(function(request,response){
if (request.url==='/') {
const html=fs.readFileSync('test.html','utf8')
response.writeHead(200,{
'Content-Type':'text/html'
})
response.end(html)
};
if (request.url==='/script.js') {
const etag=request.headers['if-none-match']
if (etag==='777') {
response.writeHead(304,{
'Content-Type':'text/javascript',
'Cache-Control':'max-age=30000000,no-cache',
'Last-Modified':'123',
'Etag':'777'
})
response.end('')
}else{
response.writeHead(200,{
'Content-Type':'text/javascript',
'Cache-Control':'max-age=30000000,no-cache',
'Last-Modified':'123',
'Etag':'777'
})
response.end('console.log("script loaded!")')
}
};
}).listen(8888)
console.log('server listening on 8888')
![](https://img.haomeiwen.com/i5982160/6ff5d60cc989fdad.png)
![](https://img.haomeiwen.com/i5982160/7108f57ebc16ddb0.png)
总结
Cache-control:nocache 可以在发起端缓存但要在服务端进行验证是否可以缓存
last-modified:上次修改时间
if-modified-since
in-unmodified-since
服务器读取这两个值,看资源是否重新修改,服务器告诉客户端是否可以用缓存的资源
etag
数据签名
数据修改,资源的数据签名就会修改
例如hash
两个属性:
if-match
if-non-match
里面放的etag值,对比服务端和客户端判断是否使用缓存
304
如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:客户端已经执行了GET,但文件未变化。
no-store
没有缓存
设置了etag、last-modified后,浏览器在第二次发起请求后就会把if-none-match和if-modified-since带上