HTTP缓存——304与200 from cache

本文深入解析HTTP缓存机制,涵盖缓存字段、强缓存、协商缓存及200fromcache与304状态码的区别。理解ETag、Cache-Control等关键概念,掌握缓存控制策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人博客原文地址

HTTP与缓存相关的字段

1. 通用字段

字段名称释义
Cache-Control控制缓存具体的行为
PragmaHTTP1.0时的遗留字段,当值为”no-cache”时强制验证缓存
Date创建报文的日期时间(启发式缓存阶段所用)

2. response字段

字段名称释义
ETag服务器生成资源的唯一标识
Vary代理服务器缓存的管理信息
Age资源在缓存代理中存贮的时长(取决于max-age和s-maxage的大小)

3. request字段

字段名称释义
If-Match条件请求,携带上一次请求中资源的ETag,服务器根据这个字段判断文件是否有新的修改
If-None-Match和If-Match作用相反,服务器根据这个字段判断文件是否有新的修改
If-Modified-Since比较资源前后两次访问最后的修改时间是否一致
If-Unmodified-Since比较资源前后两次访问最后的修改时间是否一致

4. 实体字段

字段名称释义
Expires告知客户端资源缓存失效的绝对时间
Last-Modified资源最后一次修改的时间

协商缓存(304)

If-modified-Since/Last-Modified

  • 浏览器在发送请求的时候服务器会检查请求头request header里面的If-modified-Since,如果最后修改时间相同则返回304,否则给返回头(response header)添加last-Modified并且返回数据(response body)。
if-modified-since:Wed, 31 May 2017 03:21:09 GMT
if-none-match:"42DD5684635105372FE7720E3B39B96A"

If-None-Match/Etag

  • 浏览器在发送请求的时候服务器会检查请求头(request header)里面的if-none-match的值与当前文件的内容通过hash算法(例如 nodejs: cryto.createHash('sha1'))生成的内容摘要字符对比,相同则直接返回304,否则给返回头(response header)添加etag属性为当前的内容摘要字符,并且返回内容。
etag:"42DD5684635105372FE7720E3B39B96A"
last-modified:Wed, 31 May 2017 03:21:09 GMT

请求头last-modified的日期与响应头的last-modified一致
请求头if-none-match的hash与响应头的etag一致
所用会返回Status Code: 304

强缓存(200 from cache)

  • 如果设置了Expires(XX时间过期)或者Cache-Control(http1.0不支持)(经历XX时间后过期)且没有过期,命中cache的情况下,from cache不去发出请求。如果强刷(如ctrl+r)会发起请求,但是如果没有修改会返回304内容未修改,如果已经改变则返回新内容。max-age > Expires

  • expires/cache-control虽然是强缓存,但用户主动触发的刷新行为,还是会采用缓存协商的策略,主动触发的刷新行为包括点击刷新按钮、右键刷新、f5刷新、ctrl+f5刷新等。

  • 当然如果在控制台里面选中了disable cahce则无论如何都会请求最新内容(304协商缓存、强缓存都无效),因为1.不会检查本地是否有缓存。2.请求头信息(request header)既没有If-Modified-Since也没有If-None-Match来让服务端判断。地址栏输入的地址按下回车键,该地址页面请求(仅仅是该url)的request header都会带上cache-contro:max-age=0,所以不会命中强缓存,但是通过链接点击的地址会命中缓存

  • chrome下查看所有的from cache文件:chrome://view-http-cache/

区别

  • 触发 200 from cache:

    1. 直接点击链接访问
    2. 输入网址按回车访问
    3. 二维码扫描
  • 触发 304:

    1. 刷新页面时触发
    2. 设置了长缓存、但Entity Tags没有移除时触发

流程图

流程图

GitHub:wclimb

### HTTP 200 OK 状态码 `from disk cache` 的意义及原因分析 当浏览器返回 **200 OK (from disk cache)** 响应时,这意味着请求的内容已经被存储在本地磁盘缓存中,并且浏览器未向服务器发送任何验证请求来确认资源的有效性[^1]。具体来说: - 浏览器通过检查其内部的缓存策略(通常是基于 `Cache-Control`, `Expires` 或其他类似的头部字段),判断当前资源是否仍然有效。 - 如果资源被标记为可以长期缓存,则浏览器可以直接从磁盘缓存加载数据,而不必联系远程服务器。 这种行为的主要目的是减少网络延迟并提高用户体验的速度。由于不需要额外的通信开销,因此能够显著加快页面加载时间。 相比之下,**304 Not Modified** 表示浏览器确实服务器进行了交互以验证缓存内容的新鲜度。一旦服务器回应此状态码,它告知客户端所请求的数据自上次访问以来没有改变,于是允许继续使用已有的本地副本。 #### 关于磁盘缓存的作用机制 为了更好地理解上述过程中的差异,我们还可以参考一些实际操作案例说明如何利用操作系统级别的工具优化文件系统的I/O效率。例如,在Linux环境下可以通过命令行创建特定大小的随机二进制文件用于模拟负载测试场景下的性能表现评估[^2]: ```bash dd if=/dev/zero of=testfile bs=1M count=512 sync && echo 3 > /proc/sys/vm/drop_caches ``` 在此基础上执行多次连续读取同一目标对象的操作序列后观察到的现象表明——初次尝试期间因缺乏预热效应而导致较低吞吐量;然而经过充分填充工作集之后再次测量则可达到接近理论峰值水平的结果展示出理想条件下完全依赖软件层面实现高效缓冲管理的可能性。 另外值得注意的是存在另一种形式即所谓“内存级”瞬态保留方式[^3],尽管具备极高的检索速率但由于受限于物理硬件规格通常仅适用于规模较小的对象集合并且生命周期较短容易受到外部因素干扰而丢失相关内容项除非采取特殊措施加以保护否则难以持久保存下来供后续调用之需。 综上所述,“200 OK(from disk cache)”体现了现代Web应用架构设计当中对于静态资产处理环节的一种折衷解决方案兼顾了效能提升的同时也考虑到了维护成本之间的平衡关系。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值