Cache-Control, Expires, ETag和If-None-Match

Cache-Control

cache-control用于设置缓存. 我们在服务器端设置如下:

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

服务器返回带有cache-control的响应. 当浏览器再次请求同一URL资源时, 若没有超过30秒, 则会加载缓存中的资源. 若超过30秒则会向服务器重新请求.

不能为全部资源设置缓存, 否则当服务器端更新资源时, 客户端用的还是缓存. 通常将首页不设置缓存, 其他资源设置缓存.

不为首页设置cache-control时, 当服务器更新资源时, 资源对应的URL也会改变. 此时客户端发送请求, 其请求资源的URL也会改变. 即客户端不会从缓存中获取资源, 而是从服务器端获取资源.

Expires

expirescache-coontrol的用处一样, 它也是为缓存设置有效时间. 与cache-control不同的是, expires是老的API, cache-control是新的API. 且cache-control的优先级比expires的优先级高.
expires可以用来删除cookie. cookie有下面的特性:

  • 若设置的cookie已存在, 则会覆盖之前设置的cookie.
  • 若设置的cookie不存在, 则会添加到现有cookie

没有删除已存在cookie的直接方法. 间接方法是设置相同的cookie, 并且将cookie的失效时间设置为以前
删除cookie只需设置一个已经过期的时间即可:

response.setHeader('Expires', 'Wed, 21 Oct 1900 07:28:00 GMT')

ETag和If-None-Match

在介绍ETag之前先介绍一下MD5算法. MD5算法是一个摘要算法, 它会为一个文件生成一个数字签名, 这个数字签名是独一无二的.
我们将资源的md5值放在ETag属性中, 这样当我们请求服务器的资源时, 可以比较上次请求的md5值和本次请求的md5值. 注意请求的资源的URL必须是一致的.

  • 若相等则说明资源未更新, 返回部分响应, 包含304状态码, 客户端从缓存中获取资源.
  • 反之说明资源更新了, 服务器返回完整的响应, 即客户端从服务器端获取资源.

ETag在服务器端设置:

let file = md5(string)
response.setHeader('ETag', file)
if (file === request.headers['if-none-match']) {
    response.statusCode = 304//匹配
} else {
    response.write(string)//不匹配
}

当客户端第一次请求资源时, 服务器设置ETag值并返回响应. 若客户端发送第二次请求, 会在请求体中包括If-None-Match字段, 该字段值为上次响应中的ETag值. 服务器接收第二次请求并判断服务器当前资源的ETag值与请求体中的If-None-Match值是否一致. 若一致则返回304状态码, 客户端从缓存中获取资源, 若不一致则返回新的资源.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浏览器缓存分为两种:强缓存和协商缓存。 强缓存是指浏览器在请求资源时,会先从本地缓存中查找该资源是否已经存在,并且是否过期。如果资源存在且未过期,浏览器就直接使用本地缓存中的资源,而不再向服务器发送请求,这样可以大大降低服务器的压力,提高页面加载速度。强缓存可以通过设置 HTTP 头部的 Cache-ControlExpires 字段来实现。 协商缓存是指当强缓存失效时,浏览器会向服务器发送请求,服务器会根据请求头中的 If-Modified-Since 和 If-None-Match 字段来判断资源是否被修改过。如果没有被修改过,服务器会返回 304 状态码,告诉浏览器可以直接使用本地缓存中的资源,否则服务器会返回最新的资源。协商缓存可以通过设置 HTTP 头部的 Last-Modified 和 ETag 字段来实现。 下面是一个示例代码片段,演示了如何在 HTTP 头部中设置缓存策略: ``` // 强缓存 app.get('/strong-cache', function(req, res) { res.setHeader('Cache-Control', 'max-age=3600'); // 1 hour res.send('Hello, strong cache!'); }); // 协商缓存 app.get('/conditional-cache', function(req, res) { res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Last-Modified', 'Wed, 21 Oct 2015 07:28:00 GMT'); res.setHeader('ETag', '12345'); // 如果资源未被修改过,则返回 304 状态码 if (req.headers['if-modified-since'] === 'Wed, 21 Oct 2015 07:28:00 GMT' || req.headers['if-none-match'] === '12345') { res.status(304); res.send(); } else { res.send('Hello, conditional cache!'); } }); ``` 在以上示例中,/strong-cache 和 /conditional-cache 是两个路由,分别对应强缓存和协商缓存。在强缓存中,我们通过设置 Cache-Control 头部来指定资源的缓存时间;在协商缓存中,我们通过设置 Last-Modified 和 ETag 头部来判断资源是否被修改过,并且根据请求头中的 If-Modified-Since 和 If-None-Match 字段来返回合适的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值