Nginx 不支持 http2_push_preload 指令,该指令不存在于官方版本中;实际应使用 add_header Link 实现 rel=preload 预加载,或谨慎使用已弃用的 http2_push 指令。

Nginx 本身不支持 http2_push_preload 指令——这是个常见误解。该指令并不存在于官方 Nginx(包括主流版本 1.19–1.25)中,也不是 Nginx 原生模块的功能。所谓“HTTP/2 Server Push 预加载”,实际需通过 http2_push 或更推荐的 link 头(即 Link: <...>; rel=preload)来实现,且 Server Push 在现代实践中已被逐步弃用。
为什么没有 http2_push_preload?
官方 Nginx 文档中从未定义 http2_push_preload 这一指令。它可能是对以下两者的混淆:
-
http2_push:Nginx 1.13.9+ 提供的真实指令,用于主动推送资源(如 CSS、JS),但仅限 HTTP/2 连接,且依赖客户端支持与缓存状态; -
Link响应头中的rel=preload:标准 HTTP 预加载机制,兼容 HTTP/1.1 和 HTTP/2,语义明确、可控性强,是当前推荐方式。
正确启用预加载的两种方式
方式一:使用 Link 头(推荐)
在 location 块中添加 add_header,显式声明预加载资源:
location /index.html {
add_header Link '</style.css>; rel=preload; as=style';
add_header Link '</main.js>; rel=preload; as=script';
# 可链式添加多个,注意单引号包裹、空格与分号格式
}✅ 优点:标准、安全、可缓存、不阻塞主文档解析;
⚠️ 注意:路径需为绝对路径(以 / 开头),as 属性必须准确(如 style、script、font、image),否则浏览器可能忽略。
方式二:启用 HTTP/2 Server Push(谨慎使用)
仅适用于 Nginx ≥ 1.13.9 + OpenSSL ≥ 1.0.2 + HTTP/2 启用场景:
http {
http2 on;
server {
listen 443 ssl http2;
# ...
location /index.html {
http2_push /style.css;
http2_push /main.js;
}
}
}⚠️ 风险提示:Server Push 已被 Chrome 96+ 完全移除,Firefox 也已弃用。它易造成带宽浪费、缓存失效、与浏览器 preload 竞争等问题,不建议新项目使用。
验证是否生效
打开 Chrome DevTools → Network 标签页 → 刷新页面 → 查看目标资源(如 style.css)的 Timing 或 Headers:
- 若看到
Link响应头含rel=preload,说明 Link 预加载配置成功; - 若资源在 HTML 解析前即开始下载(initiator 显示 “Push” 或 “Other”),可能是 Server Push(但现代 Chrome 不再显示 Push);
- 检查控制台是否报
Failed to parse 'Link' header,常见于路径错误或缺少单引号/空格。
补充建议
• 优先用 <link rel="preload"> 写在 HTML <head> 中,语义最清晰、调试最直接;
• 若必须服务端注入,坚持用 add_header Link,避免依赖已淘汰的推送机制;
• 所有预加载资源必须真实被页面使用,否则会浪费带宽;
• 字体预加载需加 crossorigin 属性,对应响应头应有 Access-Control-Allow-Origin: *。

















