http/2 server push 已被主流浏览器彻底移除,推送帧被静默丢弃;所谓“push 成功”均为误判,真正有效的替代方案是 rel="preload" 配合关键 css 内联。

HTTP/2 Server Push 无法加速 CSS 引入——Chrome 96+、Firefox 90+、Edge 96+ 已彻底移除 PUSH_PROMISE 处理逻辑,服务器发的推送帧会被静默丢弃,不进缓存、不触发解析、不改变加载时序。
为什么你看到的“Push 成功”全是假象
常见误判包括:
- chrome://net-internals/#http2 显示 PUSH_PROMISE —— 这只是服务器单方面发帧,浏览器早已不消费
- Wireshark 抓到 HTTP/2 推送帧 —— TCP 层可见,但 HTTP/2 解帧后直接跳过
- Lighthouse 建议“启用 Server Push” —— 规则库未更新,截至 2026 年 5 月仍沿用过时建议
- Network 面板里找不到 Initiator: Push —— 因为根本没触发,所有 CSS 请求的 Initiator 都是 Parser
Nginx 的 http2_push 现在起什么作用
配置本身仍能生效,但结果只是浪费资源:
-
http2_push /style.css;会触发一次额外的 TCP 帧发送(约 100–200 字节开销) - 路径必须是绝对路径(如
/style.css),相对路径(./style.css)或带查询参数(/style.css?v=1)均无效 - 它不感知浏览器缓存状态,容易重复推送,反而增加 TTFB(首字节延迟)
- 若响应体为空或未正确设置
:status,会触发ERR_HTTP2_STREAM_ERROR或静默失败
真正该用的替代方案: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实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











