讲师中心 微信公众号
AI工具推荐 视频效率加速

浏览器缓存中怎么利用HTTP/2的Server Push(服务端推送)打破传统的“请求-响应”缓存分配链条

落杰大大_6833

落杰大大_6833

发布时间:2026-07-23 11:45:40

|

219人浏览过

|

来源于php中文网

原创

Push Cache 是 HTTP/2 定义的临时缓存层,位于 Memory Cache 和 Disk Cache 之间,仅存活于当前 HTTPS 连接期间,路径完全匹配时可被后续请求直接命中,优先级高于 Disk Cache 但不受 Cache-Control 控制。

浏览器缓存中怎么利用http/2的server push(服务端推送)打破传统的“请求-响应”缓存分配链条

HTTP/2 Server Push 并不“打破”传统缓存链条,而是在请求发起前就将资源注入浏览器的缓存层级中,形成一条独立于常规 HTTP 缓存流程的临时缓存路径——即 Push Cache。

它不是替代 Cache-Control 或 ETag,而是新增一层短生命周期、高优先级、与连接强绑定的缓存机制。关键在于:推送资源不经过常规请求流程,却能被后续 fetch 或资源加载直接命中。


Push Cache 是什么?它在哪一级?

Push Cache 是 HTTP/2 协议定义的、浏览器实现的临时缓存层,位于 Memory Cache 和 Disk Cache 之间,但更特殊:

  • 生命周期极短:仅存活于当前 TCP 连接期间;连接关闭即清空
  • 范围受限:只对同源、同协议(HTTPS)、同连接的后续请求有效
  • 不受 Cache-Control 控制:即使响应头中 Cache-Control: no-store,仍可能进入 Push Cache
  • 优先级高于 Disk Cache:浏览器会优先查 Push Cache,再查 Disk/Memory

举例:服务器在响应 /index.html 时推送 /style.css,浏览器收到后立刻存入 Push Cache。当 HTML 解析到 <link href="/style.css"> 时,不发新请求,直接从 Push Cache 取出使用。


如何让推送资源真正“可用”而非被丢弃?

推送本身不保证资源被使用。要让 Push Cache 发挥作用,需满足三个隐性条件:

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

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

下载
  • 路径必须完全匹配:推送的 :path 帧字段(如 /style.css)必须与后续 HTML 或 JS 中实际请求的 URL 字符串完全一致(含大小写、斜杠、查询参数)
  • 不能跨域或跨协议:推送只能发生在同一 origin 的 HTTPS 连接中;HTTP/1.1 或非 TLS 连接不支持
  • 浏览器未主动拒绝:现代 Chrome/Firefox 默认接受推送,但若页面已通过 fetch() 显式请求过该 URL,部分浏览器会忽略推送(避免重复)

与传统缓存策略如何协同?

Server Push 和传统缓存不是互斥关系,而是分阶段协作:

  • 首次访问(无任何缓存):Server Push 抢在 HTML 解析完成前把 CSS/JS 推送进来 → 直接填入 Push Cache → 渲染不阻塞
  • 二次访问(已有 Disk Cache):浏览器优先走 Disk Cache(因 Push Cache 已失效),此时 Cache-Control 生效,无需推送
  • 接口类资源(如 /api/user):适合持续推送(因无强缓存),配合 http2_push_preload + Link: rel=preload; as=fetch,让浏览器既接收推送又触发预加载逻辑

注意:静态资源(CSS/JS/图片)是否推送,需权衡缓存复用率。若 Cache-Control: max-age=31536000,推送大概率浪费带宽;若资源动态生成(如带用户 ID 的 app.js?uid=123),则每次都是新 URL,Push Cache 正好补位。


实际配置中的关键细节

不同服务器实现差异大,但核心逻辑一致:

  • Apache:用 H2PushResource /style.css 指令,在响应 HTML 时自动触发推送
  • Nginx(≥1.13.9):http2_push /style.css 强制推送;或 http2_push_preload on + add_header Link "</api/data>; rel=preload; as=fetch; crossorigin" 动态触发
  • Node.js(如 http2 模块):需手动调用 stream.pushStream({ ':path': '/style.css' }),再 writeHead/write 推送响应,不能靠前端加 <link rel="preload"> 伪造

⚠️ 重点:<link rel="preload"> 是客户端提示,Link: rel=preload 响应头是服务端提示,二者都不等于 Server Push。只有服务器主动发 PUSH_PROMISE 帧,才算真正启用。


本质上,Server Push 不绕过缓存链,而是在链最前端插入一个瞬时、专用、协议级的缓存入口。它不取代 Cache-Control,但能填补首屏加载中“请求发出前”的空白期。用得好,省下一个 RTT;用得滥,反而增加冗余传输。

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

3383

2023.11.09

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

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

854

2023.11.14

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

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

6426

2024.03.12

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

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

5410

2024.08.16

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

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

481

2026.05.08

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

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

0

2026.10.15

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

0

2026.10.15

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

0

2026.10.15

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

0

2026.10.15

热门下载

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

精品课程

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

共23课时 | 8万人学习

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

共6课时 | 0.7万人学习

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

共49课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn