浏览器缓存和HTTP条件请求

时间:2024-03-15 14:10:53

HTTP条件请求

概述

条件请求:HTTP中形如If-XXX这样的请求首部字段,都可以成为条件请求,服务器接受到附带条件的请求后,只要判断指定条件为真时才会执行请求

If-Match

If-Match的字段值跟ETag值匹配一致的时候,服务器才会接受请求,他会告知 服务器匹配资源所用的实体标记(ETag)值

If-Modified-Since

如果在If-Modified-Since字段指定的日期后,资源发生了更新,服务器会接受请求,如果在指定了If-Modifiedn-Since字段值日期之后,如果请求的资源都没有过期,则返回状态码304Not Modified,If-Modified-Since用于确认代理客户端拥有本地资源的有效性,获取资源的更新日期可以通过首部字段的Last-Modified来确定

If-None-Match

只有If-None-Match的字段值与Etag值不一致时,可处理该请求,与If-Match首部字段作用相反

If-Range

If-Range 的字段值若是跟ETag值或者更新的日期时间匹配一致,那么就当做范围请求处理。如果不一致则返回所有的资源

If-unmodified-Since

首部字段If-Unmodified-Since 和首部字段 If-Modified-Since的作用相反,它的作用是告知服务器,指定的请求资源 只有在字段值内指定日期之后未发生更新才能处理请求,如果在指定日期之后发生了更新那么返回412 Percondition Failed

Max-Forwards

每次转发请求一次。数值减一,当数值变为0的时候返回响应。使用HTTP请求协议的时候,请求可能会经过代理等多台服务器,途中如果代理服务器由于某些原因转发失败,客户端等不到服务器返回的响应。加上这个参数的话可以确认最终返回响应的服务器,为终点来确定出问题的服务器

应用场景

条件式请求最常见的应用场景是更新缓存,如果缓存为空或者没有缓存的话,请求资源会以200的状态码返回资源。验证器会随着资源一起返回,他们出现在首部字段中。这些校验信息会跟着缓存一起存储,只要缓存未失效,就不会发起任何请求,一旦缓存失效客户端就会发起条件式请求,验证器的值会作用在对应的If-Match或者If-Modified-Since首部字段。如果资源未发生变化,服务器就返回304的状态码,相对对缓存资源进行了刷新。客户端采用缓存的资源。比重新传输一遍更加高效
假如资源发生了变化。客户端返回200状态码连同新版本的资源。客户端采用新版本的资源

增量下载的完整性
文件增量下载是HTTP协议的规定。它运行恢复先前的操作。通过保存先前已经获得的信息来节省带宽和资源
If-Range 来代表分块下载

浏览缓存

缓存是一种保存资源副本,并且在下次请求直接使用资源副本的技术。当web缓存发现请求的资源已经被存储。它会拦截请求。返回该资源的拷贝。而不会直接去源服务器下载。
这样的好处: 缓解服务器压力, 提升性能
缓存是达到高性能的重要组成部分。缓存需要合理配置才能达到效果
缓存分为私有与共享缓存
共享缓存存储的响应能被多个用户响应。私有缓存只能用于单独用户。
此外还有网关缓存、CDN、反向代理服务器缓存和负载均衡器等部署在服务器上为web站点提供更好稳定的性能和扩展性

  • 私有缓存
    私有缓存只能用于单独的用户,浏览器缓存拥有用户通过HTTP下载的所有文档,这些缓存为浏览器浏览过的文档提供向前/向后的切换,保存网页 查看源码等。避免向服务器发起多余的请求。甚至可以提供缓存内容供离线浏览
  • 共享缓存(代理缓存)
    共享缓存可以被多个用户使用,可能会假设web代理服务作为本地网络基础的一部分。减少热门资源的下载。减少网络拥堵与延迟

缓存目标
常见的缓存只能存储GET请求
- 可能会缓存成功的请求
- 不变的重定向 301
- 错误的响应 404页面
- 不完全的响应:状态码206返回局部的信息

缓存控制

Cache-Control 头
HTTP1.1定义Cache-Control头用于区分对缓存机制的支持情况。请求头和响应头都支持
- 禁止进行缓存
Cache-Control:no-store
Cache-COntrol:no-cache,no-store,must-revalidate
- 强制确认缓存
每次有请求发出的时候,缓存都会将请求发到服务器(会带有与本地缓存相关的字段来进行校验)服务器会校验请求中的缓存是否过期。未过期返回304过期了返回新资源
Cache-Control:no-cache
- 私有缓存和公共缓存
public 代表该响应可以被任何中间件(代理、CDN)缓存。若指定public通常不被中间人缓存的页面例如带有HTTP验证的信息的也会被缓存
private代表响应专用于某个用户的。中间人不能被缓存

  • 缓存过期机制
    过期机制中最重要的指令是 max-age=<seconds>表示资源能被缓存的最大时间。相对Expires。max-age是距离请求发起的时间秒数。针对应用中那些不会被改变的文件。可以手动设置一定的事件以确保缓存的有效。例如图片 css js 等静态资源
    Cache-Control:max-age=1222

  • 缓存验证确认当使用 must-revalidate指令。那么意味着考虑使用一个陈旧的资源时,必须先验证状态。已经过期的不会被使用

  • 新鲜度 过期时间
    由于HTTP是C/S模式的协议。服务器上面的资源进行了更新,不可能通过客户端及其缓存。所以双方必须约定过期时间。在过期时间之前资源都是新鲜的,如果在过期时间之后,陈旧的资源是不会被直接清除或者忽略的。当客户端发起请求。缓存会将此请求附件一个 验证字段来进行校验。用于节省带宽。

优先级

对于缓存Cache-Control包含max-gae=N的缓存寿命就是N。如果不包含会对弈请求头里面的Expires属性,通过比较Expires的值和头里面的Date来判断缓存是否有效。如果expires也没有。找头里的last-Modified信息。有就是头里面的Date的值减去last-Modified的值除以10
下图为请求发起过程
浏览器缓存和HTTP条件请求
验证结果:
火狐浏览器按照优先级的缓存来请求。会返回一个200的状态码。但是客户端未接受到请求
chrome浏览器在在上述规则下。会产生请求客户端和读取缓存两种。目前原因未找到。
chrom 浏览器 在请求过程中 会在请求头中添加 Provisional headers are shown ,然后开始读取缓存,当真正的请开始出发后。Provisional headers are shown 会消失。这个可以在切换弱网或后端延迟返回请求情况下看到。
下图为 last-Modified信息和请求头里面的Date的值减去last-Modified的值除以10,未超过缓存时间
浏览器缓存和HTTP条件请求
超过缓存时间后展示
浏览器缓存和HTTP条件请求

加速资源

更多的利用缓存资源。可以提高网站的性能和相应的速度。为了优化缓存。过期时间设置的长是一种策略。不频繁更新的文件在url后面增加版本号来控制。高频的文件更改文件入口
但是Cache-Control是HTTP1.1才有的,不适用与HTTP1.0,而Expires既适用于HTTP1.0,也适用于HTTP1.1,所以说在大多数情况下同时发送这两个头会是一个更好的选择,当客户端两种头都能解析的时候,会优先使用Cache-Control基础知识
客户端浏览器缓存、中间缓存、内容分发网络(CDN)和服务器上的负载平衡和反向代理。缓存,仅在反向代理和负载均衡的层面,就对性能提高有很大的帮助。