mod_substitute 本身不支持动态策略加载,但可实现响应内容的静态配置化实时优化,需依赖 mod_filter 模块并显式绑定 mime 类型,配合安全正则规则与路径范围控制,才能正确生效。

Apache 的 mod_substitute 本身不支持“动态策略加载”或运行时规则变更,但它能实现响应内容的实时、静态配置化优化——比如 CDN 资源路径替换、调试信息清理、敏感字段脱敏、协议升级(http→https)、HTML 结构微调等。关键在于配置精准、链路可控、避坑到位。
必须启用并串联两个基础模块
mod_substitute 不是独立工作的模块,它依赖 mod_filter 才能把替换逻辑挂载到响应输出链上:
- Debian/Ubuntu 系统执行:
sudo a2enmod substitute filter sudo systemctl restart apache2
- CentOS/RHEL 系统需手动编辑
httpd.conf:LoadModule filter_module modules/mod_filter.so LoadModule substitute_module modules/mod_substitute.so
只启用 substitute 模块而没配 filter,所有 Substitute 指令都会静默失效。
让替换真正生效:绑定 MIME 类型与输出链
Apache 不会自动扫描所有响应体,必须显式告诉它:“对哪些类型的内容启用替换”。
- 常见写法(仅对 HTML 生效):
AddOutputFilterByType SUBSTITUTE text/html
- 若要同时处理 JSON 接口返回(如
/api/user):AddOutputFilterByType SUBSTITUTE text/html application/json
- 注意:后端返回
Content-Type: application/json; charset=utf-8时,Apache 只匹配主类型,所以只需写application/json,不能带; charset=...。
没这行配置,Substitute 指令就像写了没编译的代码——定义了,但完全不触发。
写安全有效的替换规则:避开四大陷阱
规则语法是 Substitute "s#pattern#replacement#flags",推荐用 # 或 | 当分隔符(避免斜杠冲突),重点注意:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
双引号必须转义(JSON 场景常见):
"idCard":"110101..."→ 正则中写成"idCard":"[0-9]{17}[0-9X]"别用
d或:Apache 正则引擎不支持,统一改用[0-9]和前后固定字符串锚定
✅ 推荐:"s#"phone":"[0-9]{11}"#"phone":"****1234"#g"
❌ 避免:s/1[3-9]d{9}/.../-
跨行 JSON 易失败?加
n标志 + 关 gzip:SetEnv no-gzip 1 Substitute "s#"email":"[^"\r\n]+@[^"\r\n]+"#"email":"***@***"#gn"
顺序很重要:多条
Substitute按配置顺序执行,前一条改过的文本可能影响后一条匹配,建议把通用替换(如协议升级)放前面,精准字段替换(如身份证)放后面。
按需控制作用范围:路径 + 类型双重收敛
避免全站误替换,用 <locationmatch></locationmatch> 锁定接口,再配合 MIME 类型过滤:
<locationmatch>
AddOutputFilterByType SUBSTITUTE application/json
SetEnv no-gzip 1
Substitute "s#"mobile":"[0-9]{11}"#"mobile":"****1234"#g"
Substitute "s#"addr":"[^"\r\n]*"#"addr":"[ADDRESS_HIDDEN]"#g"
</locationmatch>
-
<locationmatch></locationmatch>支持正则,比<location></location>更精确(例如/api/v1/user/不会误中/api/v1/user-log/) -
SetEnv no-gzip 1是硬性要求:gzip 压缩后mod_substitute无法解析明文,必须在压缩前处理
替换后乱码或 JS 报错?检查编码与字节边界
mod_substitute 按字节流操作,不解析 UTF-8 多字节字符:
- 强制后端返回明确编码头:
Content-Type: text/html; charset=utf-8 - 替换规则尽量避开中文原文匹配(如
s/旧文案/新文案/),改用 ASCII 标识符(ID、class、data-* 属性、URL 路径等) - 禁用
s///n以外的模式标志(n表示单行模式,.可匹配换行符;其他如mxApache 不支持)
不复杂但容易忽略。









