apache响应体脱敏必须用mod_substitute,需协同mod_filter和mod_mime;启用addoutputfilterbytype声明mime类型,substitute指令须转义双引号、选合适分隔符,并关闭gzip以支持跨行匹配。

Apache 层无法实现真正意义上的“动态脱敏规则”管理(如条件开关、运行时策略加载、字段级策略路由),但它能通过 mod_substitute 模块对响应体做实时、静态配置的正则清洗——这是目前 Apache 原生唯一可行的响应内容改写方式。
必须启用并协同工作的模块
mod_substitute 本身不独立工作,依赖以下三者缺一不可:
- mod_filter:提供输出过滤链注册能力,是 substitute 生效的前提
- mod_substitute:执行 s///g 类正则替换的核心模块
- mod_mime(隐式需要):用于按 MIME 类型触发过滤器,确保只处理 JSON/HTML 等文本响应
启用命令(Debian/Ubuntu):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
精准匹配业务路径与响应类型
不能只靠 Location 匹配路径,必须结合 MIME 类型声明,否则 JSON 响应会被跳过:
- 用 LocationMatch 写精确路径,避免误脱敏:
- 显式声明支持的响应类型(注意:带 charset 的 Content-Type 如
application/json; charset=utf-8需省略参数):
AddOutputFilterByType SUBSTITUTE text/html application/json
正则清洗的关键写法与避坑点
Substitute 指令对语法和上下文极其敏感,常见错误会导致完全不生效:
- 双引号必须转义:JSON 中的
"idCard":"110..."要写成\"idCard\":\"[0-9]{17}[0-9X]\" - 避免分隔符冲突:含斜杠字段(如手机号)改用
#作分隔符:
Substitute "s#\"phone\":\"[0-9]{11}\"#\"phone\":\"****1234\"#g" - 跨行 JSON 失效?关闭 gzip 并加
i标志:
SetEnv no-gzip 1
Substitute "s/\"idCard\":\"[0-9]{17}[0-9X]\"/\"idCard\":\"*************X\"/gi" - 不支持
\d或\b,全部用[0-9]和前后固定字符串锚定
验证与调试建议
上线前务必确认三点:
- 后端返回的
Content-Type必须在AddOutputFilterByType列表中,且不含未声明的参数 - 开启 Apache 调试日志:
LogLevel filter:trace7 substitute:trace7,观察是否进入过滤链 - 用
curl -H "Accept-Encoding: identity" http://x/api/...绕过压缩,确保原始响应可被逐行处理










