apache虚拟主机中substitute模块实现页面文本动态替换,需加载mod_filter和mod_substitute模块,通过addoutputfilterbytype显式启用,规则置于内并注意mime类型匹配与正则转义。

Apache 虚拟主机中使用 Substitute 模块实现页面文本动态替换,核心是让 Apache 在响应返回客户端前,对 已解压、明文、匹配指定 MIME 类型 的响应体执行正则或字符串替换。它不修改后端逻辑,也不依赖源码改动,属于代理链路末端的内容改写层。
必须启用并协同的模块
仅配置 mod_proxy 或开启虚拟主机远远不够。需在主配置(如 httpd.conf 或 a2enmod 启用)中明确加载:
-
LoadModule filter_module modules/mod_filter.so—— 提供过滤器调度能力,是Substitute生效的前提 -
LoadModule substitute_module modules/mod_substitute.so—— 实际执行替换的模块
Debian/Ubuntu 系统可直接运行:a2enmod filter substitute
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
精准声明处理类型与作用范围
Substitute 默认跳过 application/json、text/plain 等常见类型,必须用 AddOutputFilterByType 显式“唤醒”它:
- 放在
<virtualhost></virtualhost>块内,或更推荐放在具体路径块(如<location></location>)中 - 示例:匹配 HTML 和 JSON 响应
AddOutputFilterByType SUBSTITUTE text/html application/json - 注意:
application/json; charset=utf-8应简写为application/json,否则不匹配
编写安全有效的替换规则
规则必须置于 <location></location> 或 <locationmatch></locationmatch> 内,且该路径实际返回目标内容类型。常用写法与要点:
- 用
#替代默认/作分隔符,避免与 URL 或 JSON 内容冲突Substitute "s#https://dev-api.example.com#/api#gi" - JSON 字段脱敏示例(身份证号模糊化):
Substitute "s#\"idCard\":\"[0-9]{17}[0-9X]\"#\"idCard\":\"*************X\"#g" - 双引号需转义为
\";不支持\d,只认[0-9] - 若响应含换行(如美化 JSON),建议加
i标志,并禁用压缩:SetEnv no-gzip 1
验证是否真正生效
别只看响应头——curl -I 完全无法反映替换结果:
- 实操验证命令:
curl -s https://yoursite.com/page | grep -o "关键词"或curl -s https://yoursite.com/api/user | python3 -m json.tool | grep idCard - 查日志定位问题:
在配置中加LogLevel substitute:trace4,检查error_log中是否触发、匹配了几处 - 确认后端未返回 gzip 压缩流(或已配置
mod_deflate解压),否则Substitute对二进制无效










