HTTP 状态码 304 缓存机制

HTTP 状态码 304 缓存机制

交互流程

客户端第一次请求服务端的某个地址时,服务端会在响应时携带 ETag 与 Last-Modified 响应头,客户端下次再发送同一地址的请求时,会携带 If-None-Match 与 If-Modified-Since 请求头,而 If-None-Match 就是 ETag 的值If-Modified-Since 就是 Last-Modified 的值,这时服务端在接收请求后会获取请求头中的这两个值,然后进行比对,若资源没有更新,则响应 304 状态码,表示请求的资源没有更新,客户端可以从自己的缓存里获取,若资源已更新,则响应 200 状态码,同第一次请求一样,又会在响应时携带新的 ETag 与 Last-Modified 响应头,之后同上逻辑循环

ETag 与 If-None-Match

ETag 是属于 HTTP 1.1 属性,它是由服务器生成返回给前端,说白了,ETag 一般为资源的哈希值,即 ETag 就是服务器生成的一个标记,用来标识资源是否有变化的,且 ETag 的优先级高于 Last-Modified

Last-Modified 与 If-Modified-Since

Last-Modified 与 ETag 类似。不过 Last-Modified 表示响应资源在服务器最后修改时间而已。

与 ETag 相比,不足为:

  1. Last-Modified 标注的最后修改只能精确到秒级,如果某些文件在 1 秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间;
  2. 如果某些文件会被定期生成,但有时内容并没有任何变化,而 Last-Modified 却改变了,导致文件没法使用缓存;
  3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形;

然而,ETag 是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。

补充说明:HTTP 缓存机制

HTTP 缓存机制主要在 HTTP 响应头中设定,响应头中相关字段为 Expires、Cache-Control、Last-Modified、Etag。

  • Expires

    • HTTP 1.0 协议中的。简而言之,就是告诉浏览器在约定的这个时间前,可以直接从缓存中获取资源(representations),而无需跑到服务器去获取。
    • Expires 因为是对时间设定的,且时间是 Greenwich Mean Time (GMT),而不是本地时间,所以对时间要求较高。
  • Cache-Control

    • HTTP1.1 协议中的,因为有了它,所以可以忽略上面提到的 Expires。因为 Cache-Control 相对于 Expires 更加具体,细致。
    • 就算同时设置了 Cache-Control 和 Expires,Cache-Control 的优先级也高于 Expires。
    • Cache-Control 响应头中常用字段的具体含义:
      • max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;
      • s-maxage:和 max-age 是一样的,不过它只针对代理服务器缓存而言;
      • public:指示响应可被任何缓存区缓存;
      • private:只能针对个人用户,而不能被代理服务器缓存;
      • no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。这个很容易让人产生误解,使人误以为是响应不被缓存。实际上 Cache-Control: no-cache 是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
      • no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值