add_before_body指令用于在HTML响应体开头插入静态HTML内容,需启用http_addition_module模块,仅对text/html类型生效,注意MIME类型配置、gzip顺序及文件路径权限。

直接用 add_before_body 指令就能在响应体开头插入内容,它不是“添加响应头”,而是往 HTML 响应体内部最前面追加一段静态 HTML —— 也就是常说的“页头”(header),不是 HTTP 头(Header)。
确认模块已启用
该模块不默认内置,必须编译时加入:--with-http_addition_module。验证方式:
- 运行
nginx -V 2>&1 | grep -- '--with-http_addition_module',有输出即支持 - OpenResty 用户无需额外操作,模块默认包含
配置 add_before_body 插入页头
在匹配 HTML 页面的 location 块中设置,例如:
-
add_before_body /includes/header.html;→ 插入本地静态文件(路径相对于root或alias) -
add_before_body /common/header;→ 发起子请求,由 Nginx 自己返回内容(需另配对应location = /common/header) - 确保目标 location 只处理
text/html类型:默认只生效于Content-Type: text/html的 200 响应
注意 MIME 类型与压缩冲突
模块默认仅作用于 text/html。若后端返回带 charset 的类型(如 text/html; charset=utf-8),建议显式声明:
addition_types text/html application/xhtml+xml;- 禁用
gzip on,或确保gzip指令写在add_before_body之后(否则压缩会绕过注入) - 不支持对 JSON、JS、CSS 等非 HTML 响应使用,否则会破坏格式
文件路径与权限要点
路径解析依赖当前上下文的 root 或 alias:
- 若
location / { root /var/www/site; },则add_before_body /includes/header.html实际读取/var/www/site/includes/header.html - 若用
alias /var/www/site/includes/;,则应写add_before_body header.html(不能带前导斜杠) - Nginx worker 进程需对文件有读权限,且文件必须是纯 HTML,不解析 SSI、变量或 Lua


















