HTTP缓存——304与200 from cache

news/2024/9/17 8:02:59

个人博客原文地址

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://lihuaxi.xjx100.cn/news/237421.html

相关文章

java遍历的优化

说明&#xff1a;这是在面试中面试官出的题。虽然是常见的优化问题&#xff0c;但这种经验的确很有用。感慨之余&#xff0c;分享出来&#xff0c;以此共勉。 场景&#xff1a;现有List<PersonA>,List<PersonB>,PersonA 的属性是 String类型的身份证号&#xff0c;…

同步等待 异步等待_异步/等待和承诺的解释

同步等待 异步等待The async / await operators make it easier to implement many async Promises. They also allow engineers to write clearer, more succinct, testable code.async / await 运算符使实现许多异步Promises变得更加容易。 它们还允许工程师编写更清晰&#…

面试准备--7.31

22222转载于:https://www.cnblogs.com/czlovezmt/p/9398015.html

rest api_REST API

rest api历史 (History) REST stands for Representational State Transfer protocol. Roy Fielding defined REST in his PhD dissertation in 2000.REST代表再表象小号泰特贸易交接协议。 Roy Fielding在2000年的博士学位论文中定义了REST。 什么是REST API&#xff1f; (Wh…

高性能千万级定时任务管理服务forsun使用详解

Forsun高性能高精度定时服务&#xff0c;轻松管理千万级定时任务。项目地址&#xff1a; https://github.com/snower/forsun 使用 linux 系统定时器提供精确到秒级的定时调度&#xff0c;长时间运行保证无误差。支持本地内存存储和 redis 持久化存储&#xff0c;使用 redis 可轻…

springBean生命周期----来自spring实战总结

1、Spring对bean进行实例化 2、Spring将值和bean的引用注入到bean对应的属性中(比如说注入到被依赖的bean的方法中或属性里) 3、如果bean实现了BeanNameAware接口,将会将bean的Id传入setBeanName()方法中 4、如果bean实现了BeanFactoryAware接口,将会设置bean的BeanFactory的引…

创建数据目录及多节点目录

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自链客区块链技术问答社区&#xff0c;未经允许拒绝转载。 创建数据目录及多节点目录 mkdir -p ~/workmeta/EduEthereumServerDeploy/deploy_2/{node1,node2} > cd ~/workmeta/EduEthereumServerD…

craigslist_Craigslist,Wikipedia和丰富经济

craigslistYou’ve heard it before. Maybe you’ve even said it. “There’s no such thing as a free lunch.”你以前听过 也许你甚至已经说过了。 “没有免费的午餐之类的东西。” “You can’t get something for nothing.”“你不能一无所获。” “Somebody has to pay…