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.mzph.cn/bicheng/78799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

半监督学习与强化学习的结合:新兴的智能训练模式

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

复习Vue136~180

1.使用create-vue创建项目 npm init vuelatest 项目目录和关键文件&#xff1a; new Vue() 创建一个应用实例 > createApp()、createRouter() createStore() 、将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…

QT采用mqtt进行通信(17.1)

文章目录 1.试错历程2. qt5.8安装3. 开始搞了4. 测试连接mqtt broker1.试错历程 尝试过网上说的各种版本,官方库和第三方库,试过qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各个版本,都能编译通过,调用mqtt库,但是都不能连接成功,真的是试吐了,不知道他们的为什么都能成功,…

西门子PLC结构化编程_水处理系统水泵多备多投

文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …

QT:自定义ComboBox

实现效果: 实现combobox的下拉框区域与item区域分开做UI交互显示。 支持4种实现效果,如下 效果一: 效果二: 效果三: 效果四: 实现逻辑: ui由一个toolbutton和combobox上下组合成,重点在于combobox。 我设置了4种枚举,ButtonWithComboBox对应效果一;OnlyButt…

VS2022+OpenCasCade配置编译

一、Open CASCADE Technology介绍及安装&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;简称OCCT&#xff09;是一款开源的 3D CAD/CAM/CAE 软件开发平台&#xff0c;广泛应用于工业设计、工程仿真、制造等领域。开源OCC对象库是一个面向对象C类库&…

【OSG学习笔记】Day 12: 回调机制——动态更新场景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用来动态更新场景的关键机制。 借助UpdateCallback&#xff0c;你能够实现节点的动画效果&#xff0c;像旋转、位移等。 NodeCallback osg::NodeCallback 是一个更通用的回调类&…

全新升级:BRAV-7601-T003高性能无风扇AI边缘计算系统,助力智能未来!

在数字化与智能化飞速发展的今天&#xff0c;AI边缘计算正成为各行各业的核心驱动力。BRAV-7601作为一款高性能无风扇AI边缘计算系统&#xff0c;凭借其强大的硬件配置与丰富的扩展能力&#xff0c;为车路协同、特种车辆车载、机器视觉、医疗影像等领域提供了卓越的解决方案。最…

删除 Git 远程记录并重新设置

删除 Git 远程记录并重新设置 以下是在 Windows 平台上删除当前项目的 Git 远程记录并重新设置远程存储库的步骤&#xff1a; 步骤一&#xff1a;查看当前远程仓库 首先&#xff0c;检查当前设置的远程仓库&#xff1a; git remote -v这会显示所有已配置的远程仓库及其 URL…

有哪些和PPT自动生成有关的MCP项目?

随着AI技术的快速发展, Model Context Protocol(MCP) 作为一种连接大型语言模型(LLMs)与外部工具的开放协议,正在重塑自动化办公领域。在PPT自动生成场景中,MCP通过标准化接口实现了AI模型与设计工具、数据源的无缝整合。以下从技术框架、项目案例、应用场景三个维度展开…

PostgreSQL psql 命令和常用的 SQL 语句整理

PostgreSQL psql 命令和常用的 SQL 语句整理 1、登录PostgreSQL数据库2、psql 命令3、数据库操作4、模式操作5、表操作6、数据操作7、索引操作8、视图操作9、权限操作 1、登录PostgreSQL数据库 在系统的命令行界面&#xff08;如 Windows 的 cmd 或者 PowerShell、Linux 的终端…

【unity游戏开发入门到精通——UGUI】文本输入控件 —— InputField旧控件

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言1、文本输入控件2、InputField旧文本输入控件组成 一、InputField文本输入…

获得ecovadis徽章资格标准是什么?ecovadis评估失败的风险

EcoVadis徽章资格标准 EcoVadis徽章是对企业在可持续发展&#xff08;环境、劳工与人权、商业道德、可持续采购&#xff09;方面表现的认可。获得徽章需满足以下条件&#xff1a; 完成评估&#xff1a; 企业必须完成EcoVadis的问卷评估&#xff0c;并提交所有必要文件。 评分…

Python初学 有差异的知识点总结(一)

目录 一、基础语法规则 1.注释 2.代码编写 二、基础语法 1.变量 2.数据类型 3.数据类型的转换 &#xff08;1&#xff09;隐式转换 &#xff08;2&#xff09;显示转换 4.标识符 5.运算符 6.字符串 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;拼接 …

Java面试场景深度解析

Java面试场景深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于Java项目中的各种技术场景题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我们公司的面试现场。请问您对Java内存模型…

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…

Spring-全面详解(学习总结)

一&#xff1a;概述 1.1 为什么学 解决了两个主要问题 1. 2 学什么 1.3 怎么学 二&#xff1a;系统架构 作用&#xff1a;web开发、微服务开发、分布式系统开发 容器&#xff1a;用于管理对象 AOP:面向切面编程&#xff08;不惊动原始程序下对其进行加强&#xff09; 事…

企业架构之旅(2):解锁TOGAF ADM

文章目录 一、什么是 TOGAF ADM二、TOGAF ADM 的关键阶段架构愿景&#xff08;Phase A&#xff09;业务架构&#xff08;Phase B&#xff09;信息系统架构&#xff08;Phase C&#xff09;技术架构&#xff08;Phase D&#xff09;机会与解决方案&#xff08;Phase E&#xff0…

MySQL 中 SQL 语句的详细执行过程

MySQL 中 SQL 语句的详细执行过程 当一条 SQL 语句在 MySQL 中执行时&#xff0c;它会经历多个阶段的处理。下面我将详细描述整个执行流程&#xff1a; 1. 连接阶段 (Connection) 客户端与 MySQL 服务器建立连接服务器验证用户名、密码和权限连接器负责管理连接状态和权限验…

ETL架构、数据建模及性能优化实践

ETL&#xff08;Extract, Transform, Load&#xff09;和数据建模是构建高性能数据仓库的核心环节。下面从架构设计、详细设计、数据建模方法和最佳实践等方面系统阐述如何优化性能。 一、ETL架构设计优化 1. 分层架构设计 核心分层&#xff1a; 数据源层&#xff1a;对接O…