初解 HTTP 缓存

Cache-Control

希望某请求被缓存,加一个响应头

response.setHeader('Cache-Control','max-age=300000000')

max-age=300000000表示300000000s内再次执行,直接从缓存中读取内容,不请求,下载时间为0,不会重新下载

注意:

1.首页不要设置缓存,特别是html

2.通常max-age设置的时间比较长,若有升级或改变,修改URL即可,可以加一个查询参数,如./style.css?v=2

Expires

response.setHeader('Expires','Mon, 12 Aug 2019 06:11:29 GMT')

设置时间为某时刻,表示一旦过了该时刻,将会要重新下载。

问题:若用户本地时间错乱,缓存将可能会立即失效。

问:Cache-Control与Expires的区别?

1.Cache-Control是设置时间长度,Expires是设置时间点,推荐使用Cache-Control,因为若客户本地时间一旦错乱,Expires设置缓存可能会受到影响,可能会立即失效。

2.若两个都设置了,会优先使用Cache-Control,因为Cache-Control是新版API。

ETag

var md5 = require('md5')

if(path === './main.js'){
let string = fs.readFileSync('./main.js','utf-8')
    response.setHeader('Content-Type','application/javascript;charset=utf-8')
    let fileMd5 = md5(string)
    response.setHeader('ETag',fileMd5)
    if(request.headers['if-none-match'] === fileMd5){
        response.statusCode = 304 //没有响应体
    }else{
        response.write(string) //有响应体
    }
}

*Md5摘要算法 

问:Cache-Control与ETag的区别?

如果用Cache-Control,是直接不请求,ETag会产生请求(Md5相同的情况下),但是不下载,有响应头,但是响应体是空的。推荐使用Cache-Control。

原文地址:https://www.cnblogs.com/BUBU-Sourire/p/11339120.html