当前位置: 首页 > news >正文

NGINX ngx_http_addition_module 模块响应体前后注入内容

一、模块概述

  • 模块名称ngx_http_addition_module
  • 引入版本:自 0.7.9 起支持 addition_types,0.8.29 起支持“*”通配;
  • 功能:对符合 MIME 类型的响应,在响应体前后分别插入指定子请求 URI 返回的内容;
  • 默认状态:未内置,需要编译时加上 --with-http_addition_module

二、编译启用

# 假设已下载 nginx 源码:
./configure --with-http_addition_module [其他参数...]
make
sudo make install

完成后可通过 nginx -V 查看是否出现 --with-http_addition_module 标志。

三、核心指令

1. add_before_body

add_before_body uri;
  • 作用:在主响应体内容前,发起子请求 uri,并将子请求返回的响应体插入主响应中;
  • 上下文httpserverlocation
  • 取消继承:传入空字符串 add_before_body ""; 即可清除上级配置的前置注入。

2. add_after_body

add_after_body uri;
  • 作用:在主响应体内容后,发起子请求 uri,并将子请求返回的响应体追加到主响应后;
  • 上下文:同上;
  • 取消继承add_after_body "";

3. addition_types

addition_types mime-type ...;
  • 默认值:仅对 text/html 响应生效;
  • 扩展:可指定多种 MIME 类型,或使用 * 对任意类型生效(0.8.29+);
  • 上下文httpserverlocation

四、基本示例

http {server {listen 80;server_name example.com;# 对所有 text/html 响应,插入公共头与脚location / {add_before_body /common/header.html;add_after_body  /common/footer.html;}# 子请求返回的数据,仅做纯文本注入location = /common/header.html {default_type text/html;return 200 '<header><h1>欢迎访问 Example</h1></header>';}location = /common/footer.html {default_type text/html;return 200 '<footer><p>&copy; 2025 Example.com</p></footer>';}}
}
  • 客户端访问 /index.html 时,NGINX 先读取原始文件内容,再分别向 /common/header.html/common/footer.html 发起子请求,将两者内容前后拼接后返回。

五、进阶场景

1. 多类型注入

location /api/ {addition_types application/json text/plain;add_after_body  /injection/logging;
}

针对 JSON 接口或纯文本接口,也可注入调试信息或埋点脚本。

2. 条件注入

利用 ifmap 等指令,按请求参数或 Header 控制是否注入:

map $arg_debug $do_add {default "";1       "/debug/info.html";
}location / {add_after_body $do_add;addition_types *;
}

当请求携带 ?debug=1 时,才将 /debug/info.html 内容追加至任意 MIME 类型响应后。

3. 与缓存配合

若子请求内容稳定,可借助 proxy_cachefastcgi_cache 缓存子请求,减少注入带来的性能开销。

六、性能与注意事项

  1. 子请求开销
    • 每一次注入都伴随子请求,可能增加延迟;建议将静态注入内容放在内存 lua_shared_dict(OpenResty)或缓存模块中。
  2. MIME 类型过滤
    • 默认仅对 text/html 注入;如果插入到二进制(如图片、下载包)将损坏响应,务必通过 addition_types 精确限定,或使用 * 时结合条件判断。
  3. 继承与层级
    • http/server 级定义全局注入,location 可覆盖:使用空参数清除继承。
  4. 循环注入
    • 注意避免子请求 URI 又被自身注入,导致死循环;可通过精确 location = /uri 或在子请求中设置 add_before_body ""/add_after_body "" 取消注入。

七、总结

ngx_http_addition_module 提供了一种优雅的“响应体加料”手段,适合注入通用页头、页脚、埋点脚本及调试信息等场景。得益于子请求机制,可灵活复用已有模板或动态生成内容。结合 addition_types、条件判断与缓存优化,可在保证性能的前提下,实现高度可控的内容插入。希望本文示例与实践建议,能帮助你快速上手该模块,为你的 NGINX 服务增色添彩。

http://www.xdnf.cn/news/188533.html

相关文章:

  • VS2022+OpenCasCade配置编译
  • 【leetcode】最长公共子路径问题
  • 从大众传媒到数字生态:开源AI智能名片链动2+1模式S2B2C商城小程序驱动的营销革命
  • prompt提示词编写技巧
  • Context7 MCP:提供实时、版本特定的文档以解决AI幻觉问题
  • Go 语言入门:(一) 环境安装
  • 大语言模型(LLMs)微调技术总结
  • web 基础与 http 协议
  • 【JAVA ee初阶】多线程(3)
  • es+kibana---集群部署
  • MYOJ_1349:(洛谷P3951)[NOIP 2017 提高组] 小凯的疑惑(数学公式套用,两步搞定代码)
  • 快速上手QEMU:创建你的第一个虚拟机实例
  • 深入浅出限流算法(一):简单但有“坑”的固定窗口计数器
  • 大数据应用开发和项目实战
  • 第五章、SpringBoot与消息通信(三)
  • 线性代数——行列式⭐
  • 任意波形发生器——2路同步DA模拟量输出卡
  • 项目管理 - 1.Maven
  • [特殊字符] SpringCloud项目中使用OpenFeign进行微服务远程调用详解(含连接池与日志配置)
  • stm32week13
  • Swiper 在 Vue 中的使用指南
  • 02《小地图实时》Unity
  • 榕壹云信用租赁系统:基于ThinkPHP+MySQL+UniApp的全链路免押租赁解决方案
  • [ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec
  • 基于ffmpeg的音视频编码
  • 电路研究9.3.2——合宙Air780EP中的AT开发指南:HTTP(S)-PDP的研究
  • 【图论 拓扑排序 bfs】P6037 Ryoku 的探索|普及+
  • SpeedyAutoLoot
  • DeepSeek+Dify之五工作流引用API案例
  • 在自动驾驶数据闭环中的特征工程应用