浏览器缓存中304 Not Modified 状态码的底层含义:为什么它没有响应体(Body)却能加速页面渲染

大墨姑娘_3250

大墨姑娘_3250

2026-07-21

668人浏览

原创

304 not modified不是错误,而是服务端确认客户端缓存有效后跳过响应体传输的协商缓存机制;它依赖首次响应携带last-modified或etag及cache-control,由服务器比对条件请求头后直接终止处理流程,仅返回状态码和极简头部,浏览器随即复用本地缓存。

浏览器缓存中304 not modified 状态码的底层含义:为什么它没有响应体(body)却能加速页面渲染

304 Not Modified 不是错误,而是服务端告诉浏览器“你本地存的那份资源还新鲜,直接用,别重下”。它没有响应体,正是因为这个决定本身——省掉传输、跳过读取、不构造内容——就是加速的核心逻辑。

304 的本质是“跳过”而非“返回”

当浏览器发起带 If-Modified-Since 或 If-None-Match 的请求时,Nginx(或其它服务器)并不加载文件内容,也不组装 HTML/CSS/JS 数据。它只做两件事:

  • 检查目标文件的修改时间是否 ≤ 请求头中的时间戳(Last-Modified 场景)
  • 或比对 ETag 值是否完全一致(ETag 场景)

一旦条件成立,Nginx 立即终止后续处理流程:不打开文件、不读磁盘、不序列化内容、不计算 Content-Length。响应仅含状态行和极简头部(如 Date、Server),响应体严格为 0 字节。

为什么没 Body 却能正常渲染?

浏览器收到 304 后,不会等待新内容,而是立刻启用本地缓存副本。这个过程发生在内存中,无需网络 I/O 或解码等待:

page-agent 浏览器控制(CDP)
page-agent 浏览器控制(CDP)

使用 page-agent CLI(CDP)控制浏览器;CLI只能通过 GitHub Release 的 .tgz 安装,npm 官方包暂未发布。

下载
  • HTML 文件缓存后,DOM 构建可立即复用已解析树
  • CSS 文件缓存后,样式规则直接注入渲染引擎
  • JS 文件缓存后,脚本字节码保持可执行状态,跳过下载与编译前置步骤

真正耗时的环节——网络传输、磁盘读取、文本解析、语法分析——全部被绕过。实测显示,单次 304 可节省约 50–300 KB 传输量,同时减少 80–200 ms 渲染延迟。

触发 304 的硬性前提

不是所有请求都能走到 304。必须同时满足:

  • 首次响应携带 Last-Modified 或 ETag(缺一不可)
  • 响应头中设置有效的 Cache-Control: max-age=… 或 Expires
  • 缓存过期后,浏览器自动带上对应条件头发起验证请求
  • 服务端未主动清除或覆盖 Last-Modified/ETag(例如 Nginx 中误写 add_header Last-Modified "")

若 HTML 文件改了但仍是 304,大概率是文件系统 mtime 未更新,或 ETag 没随内容重新生成。

前端无法“制造”304,但可以保护链路

304 完全由服务端决策,前端唯一能做的,是避免破坏协商机制:

  • 开发调试时慎用 DevTools 的 “Disable cache”,它会禁用所有条件请求
  • 不要在 fetch 请求中手动删除 If-None-Match —— 浏览器加的,删了就变 200
  • SPA 应用中,HTML 通常只加载一次;真正依赖 304 的是 .js、.css、图片等静态资源

相关专题

更多
http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3403

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

874

3

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2024.03.12

6446

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5410

6

Go 语言 HTTP 编程与中间件开发教程合集
Go 语言 HTTP 编程与中间件开发教程合集

全面讲解 Go 语言 HTTP 编程的核心知识,涵盖 net/http 标准库的 Server/Handler/HandlerFunc 体系、DefaultServeMux 路由注册与自定义路由器、Request / ResponseWriter 请求响应处理、中间件(Middleware)链式设计模式与常见中间件(日志/CORS/认证/限流)开发、http.Client 的超时配置与连接池管理、Cookie / Session 处理、

2026.05.08

481

31

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

0

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
燕十八nginx精品视频教程
燕十八nginx精品视频教程

共23课时 | 8万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.7万人学习

Golang云原生架构师课程
Golang云原生架构师课程

共49课时 | 4.8万人学习