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:禁止一切缓存(这个才是响应不被缓存的意思)。

HTTP 状态码 304 缓存机制相关推荐

  1. http状态码304缓存机制(强缓存和协商缓存-304)

    前言:好久没写博客了,今天早上闲着没事重新看了下http的304缓存机制.下面我就简单的讲下我的理解吧. 描述:首先我们先明白一点什么是状态码.对于我们开发来说,大家一说起http状态码,都能随口说几 ...

  2. 协商缓存与状态码304

    协商缓存与状态码304 304 有时候我们访问某些网站会发现在控制台中,网络状态码返回的是304.(更多状态码相关-http必备知识点:http请求与js及状态码) 304(Not Modified) ...

  3. HTTP状态码304与ETag详解

    总结一下,最近项目开发遇到的.由于缓存框架设计时,缓存请求文件时只以发起请求的url 为key,导致在客户端发起url 相同,传参类型不同的请求时,交替请求会出现,带上一次请求返回的etag ,进行下 ...

  4. HTTP:状态码304

    状态码304 相关头信息   * Last-Modified:响应头,表示当前资源的最后修改时间:   * If-Modified-Since:请求头,表示缓存的资源最后修改时间: 状态码304:表示 ...

  5. 服务器缓存返回状态码,浏览器缓存,状态码200与304

    清除浏览器中的缓存,必须从服务端获取最新内容,但不是所有浏览器都支持.. 2.HTTP头信息 Expires:即在 HTTP 头中指明具体失效的时间(HTTP/1.0) Cache Control:m ...

  6. HTTP状态码304详解

    图和代码来源理解HTTP缓存和304状态码 下图是使用express启动了一个服务,启动之后浏览器访问两次localhost:8080所得请求.响应头 var express = require('e ...

  7. 返回状态码304 Not Modified详解

    第一次访问 200 鼠标点击二次访问 (Cache) 按F5刷新 304 按Ctrl+F5强制刷新 200 在客户端向服务端发送http请求时,若返回状态码为304 Not Modified 则表明此 ...

  8. 状态码304的简单介绍

    参考: 百度百科.HTTP Status Code 304 状态码的详细讲解 304 是对客户端有缓存情况下服务端的一种响应. 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客 ...

  9. http状态码304

    简单来说, 304状态码表示资源未被修改.当不是第一次访问一个静态页面或者图片时,就会得到这么一个提示.这个是服务器提示浏览器,这个资源没有发生改变,你直接使用上一次下载的就行,不需要重新下载.这样节 ...

最新文章

  1. 第八章 异常控制流 笔记
  2. SSH异常“Failed to start OpenSSH Server daemon”问题排查
  3. mysql创建字段非空NOT NULL的好处
  4. 信息摘要算法之四:SHA512算法分析与实现
  5. Spring配置内置的连接池DriverManagerDataSource
  6. electron 项目的搭建方式,借助 node 和 npm
  7. 基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码
  8. jsp value设置为函数的返回值_python中的生成器函数是如何工作的?
  9. Vivado入门创建工程之----流水灯
  10. [深度学习]什么叫梯度学习
  11. 有了它,让我在bug面前一点也不慌!
  12. n个人看了这个故事之后精神分裂了(ZT)
  13. 入门到 精通 JavaScript中的正则表达式RE、RegExp
  14. caffe 实践程序3——caffe提取特征以及由模型test数据
  15. 《概率论与数理统计》(浙大第四版)第一章总结笔记(纯手写)
  16. android横向分割线,Android在两个分隔线之间水平对齐TextView
  17. symbian 如何在安装时备份sis文件
  18. MobaXterm 最下面显示服务器信息
  19. Excel空白单元格如何填充上方的数据
  20. linux ATT汇编 输出hello world

热门文章

  1. llama.cpp LLM模型 windows cpu安装部署;运行LLaMA2模型测试
  2. 第五章:IO流-字节流不能读中文,可以写中文
  3. 解决腾讯云服务器存在端口(6379)对外攻击行为
  4. 数据库完整性(实体完整性、参照完整性、用户定义的完整性、完整性约束命名字句、断言、触发器)
  5. (0.50mm)TF31-4S-0.5SH 4 位置 FFC,FPC 连接器、G846A10221T4EU(1.0MM)矩形连接器 互连器件
  6. 用java模拟计算器的基本四则运算
  7. 项目上线就炸,这谁受得了
  8. 2022.03.11
  9. python怎么画参数函数图像_python函数 图
  10. 使用PHP辅助快速制作一套自己的手写字体实践