subs_filter模块可零侵入实现响应体敏感词实时替换;需确认已编译安装,支持正则、忽略大小写、多行匹配;须禁用gzip、配置buffer、指定types、关闭last_modified。

直接在 Nginx 配置中启用 subs_filter 模块,就能在不碰前端源码、不改后端逻辑的前提下,对响应体中的敏感关键词做实时字符串替换。它工作在代理层,属于“零侵入”方案,但要注意:这不是原生 Nginx 模块,而是第三方扩展模块(nginx_substitutions_filter),需确认已编译安装,且能力比原生 sub_filter 更强——支持正则、大小写忽略、多行匹配等。
确认模块已加载并可用
原生 sub_filter 不支持正则,而 subs_filter 可以。先验证是否就绪:
- 运行
nginx -V 2>&1 | grep -o nginx_substitutions_filter,有输出表示模块已编译进 Nginx - 若无,需重新编译 Nginx,添加
--add-module=/path/to/ngx_http_substitutions_filter_module - 配置中无需额外加载指令(如
load_module),模块启用即生效
基础替换语法与敏感词脱敏写法
subs_filter 指令支持正则表达式和标志位,更适合处理手机号、邮箱、身份证等格式化敏感信息:
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 手机号掩码(保留前3后4):
subs_filter '1[3-9]\d{9}' '1$1****$2' r;(需配合捕获组,实际用(\d{3})\d{4}(\d{4})+$1****$2) - 忽略大小写替换“TEST”或“test”:
subs_filter 'test' '[REDACTED]' gir;(g=全局,i=忽略大小写,r=正则) - 匹配含换行的 HTML 片段(如测试环境提示):
subs_filter '<div class="env">DEV</div>' '<div class="env" style="display:none">DEV</div>' r;
关键配套配置确保替换生效
即使正则写对,也可能因传输机制失效。必须同步调整以下几项:
- 禁用后端 gzip 压缩:
proxy_set_header Accept-Encoding "";,让上游返回明文响应 - 关闭分块传输干扰:设
proxy_buffering on;并配合理大小的proxy_buffer_size 128k;和proxy_buffers 4 256k; - 显式声明响应类型:
subs_filter_types text/html text/plain application/json application/javascript text/css;(默认只认text/html) - 避免 Last-Modified 头跳过过滤:
subs_filter_last_modified off;
避坑要点与调试建议
该模块强大,但也容易配错。常见问题及对策:
- 正则未生效?检查是否漏加
r标志;中文或特殊符号需确保配置文件编码为 UTF-8,且响应头含charset=utf-8 - 替换后页面错乱?避免在
<script></script>或<style></style>标签内做宽泛正则(如.*),优先用精确模式或单独location隔离 JS/CSS 路径处理 - 无法调试?临时加
add_header X-Subs-Filter "active";确认配置加载;用curl -v http://host/path查看原始响应体,别依赖浏览器开发者工具的渲染后 DOM - 循环替换风险:如
subs_filter 'abc' 'xyz'; subs_filter 'xyz' 'abc';会陷入无限替换,Nginx 可能报错或截断响应
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










