关于HTTP缓存验证Last-Modified和Etag的使用

本文详细介绍了HTTP缓存验证的过程,包括Cache-Control、Last-Modified和Etag的使用。当设置Cache-Control为no-cache时,浏览器每次请求都会向服务器验证资源是否更新。Last-Modified通过比较资源的最后修改时间来决定是否使用缓存,而Etag则是通过资源内容的签名来验证。通过示例代码展示了服务器如何响应验证请求,并在资源未修改时返回304 Not Modified状态码,从而避免传输实际内容。

关于资源验证

  • 如果给Cache-Control设置no-cache之后,每次浏览器发起对设置了Cache-Control的资源请求的时候
  • 都要去到服务器端进行一个资源的验证, 验证如果资源可以使用,那么才会读取本地的缓存

缓存验证流程

  • 1 ) 浏览器创建了一个请求, 首先请求到达的地方是在本地缓存, 当然是建立在有Cache-Control头的情况下
    • 如果在本地缓存里查找,如果找到,则直接返回给浏览器渲染页面
    • 这种情况下, 不会经过任何网络的传输,也就是from memory cache的效果
  • 2 ) 如果没有找到,就会去网络请求,在网络请求中,如果经过代理服务器(代理缓存)
    • 那么首先会在代理服务器上查找相关缓存信息, 如果找到就会返回给客户端
    • 经过本地缓存,再返回给浏览器渲染页面
  • 3 ) 如果在代理服务器上没有找到该缓存信息,那么就直接去源服务器上查找资源
    • 获取了新的内容之后,再逐级向下进行返回和二次缓存
    • 最终返回给浏览器进行页面的渲染

如何进行缓存验证

  • 在HTTP里主要有两个验证的HTTP头:Last-Modified, Etag
  • Last-Modified: 上次修改时间
    • 也就是说给这个资源设置了上次是什么时间修改的
    • 主要配合If-Modified-Since或If-Unmodified-Since使用
    • 如果请求了一个资源,其返回头信息中有Last-Modified字段,其指定了一个时间
    • 在下一次浏览器发起请求的时候,就会带上这个Last-Modified字段信息
    • 通过If-Modified-Since或If-Unmodified-Since
    • 通常浏览器的实现会选择If-Modified-Since
    • 在请求中将其带到服务器上, 服务器就可以读取头信息中的If-Modified-Since对比该资源上次修改时间
    • 如果时间一样,那么代表资源没有被重新修改过, 服务器就可以告诉浏览器可以直接使用缓存的信息
    • 这就是对比上次修改时间以验证资源能否使用缓存,是否需要更新的过程
  • Etag: 是更加严格的一个验证
    • 其验证主要是通过数据签名:对资源内容产生一个唯一的签名
    • 如果资源数据进行了修改, 签名就会变成一个新的,任何修改就会造成两次签名不一样
    • 最典型的方法是对资源内容进行哈希计算, 得到一个唯一值作为签名来标记这个资源
    • 下一次浏览器发起请求的时候,就会带上If-Match或If-Non-Match字段,其值就是服务端返回的Etag值
    • 对比资源签名,判断是否使用缓存

程序示例

  • test.html

    <script src="/script.js"></script>
    
  • server.js

    const http = require('http');
    const fs = require('fs');
    
    http.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值