http/2 push 已无法主动推送 css,chrome 96+、firefox 90+、edge 96+ 完全移除 push_promise 处理逻辑,服务器推送帧被静默丢弃;应改用 rel="preload" 预加载和关键 css 内联。

HTTP/2 Push 已无法主动推送 CSS —— 主流浏览器自 2021 年起逐步弃用,Chrome 96+、Firefox 90+、Edge 96+ 已完全移除 PUSH_PROMISE 处理逻辑,服务器发的推送帧会被静默丢弃。
为什么你看到的“推送成功”都是假象
很多开发者在 chrome://net-internals/#http2 里看到 PUSH_PROMISE 日志,或用 Wireshark 抓到 HTTP/2 推送帧,就以为 CSS 真被提前加载了。其实这只是服务器单方面发帧,客户端早已不消费:
- Network 面板中所有 CSS 请求的
Initiator都是Parser,绝不会出现Push -
curl --http2 -I返回头里有Link: ; rel=preload; as=style≠ Server Push,这只是预加载提示 - Lighthouse 若还建议“启用 Server Push”,说明其规则库已过时(截至 2026 年 5 月仍未更新)
Apache/Nginx 的 http2_push 配置现在起什么作用
配置本身仍能生效,但结果只是浪费资源:
-
H2PushResource "/style.css"(Apache)或http2_push /style.css;(Nginx)会触发一次额外的 TCP 帧发送,约 100–200 字节开销 - 路径必须是绝对路径(如
/style.css),相对路径(./style.css)或带查询参数(/style.css?v=1)均无效 - 推送流若未正确设置
:status或响应体为空,会触发ERR_HTTP2_STREAM_ERROR或静默失败 - 它不感知浏览器缓存状态,容易重复推送,反而增加 TTFB(首字节延迟)
真正该用的替代方案:rel="preload" + 关键 CSS 内联
这是目前唯一被全平台支持、语义明确、可缓存、可中断的提前加载方式:
- 在 HTML 的
中写:<link rel="preload" as="style" href="/main.css">—— 必须是绝对路径,不能加onload或crossorigin(除非真需跨域) - 后续
<link rel="stylesheet" href="/main.css">会复用已预取的响应,避免二次请求 - 首屏关键 CSS 应直接内联为
<style>...</style>,实现零 RTT 渲染 - 非关键 CSS 可配合
media属性条件加载,比如<link rel="stylesheet" href="/print.css" media="print">
Server Push 不是配错了,是协议功能已被浏览器删除。把调试 http2_push 的时间,换成提取 Critical CSS、验证 rel="preload" 路径是否可访问、确认 Brotli 压缩和 TLS 1.3 是否启用,才真正影响首屏性能。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











