必须启用mod_filter和mod_substitute,且响应体需明确声明mime类型(如text/html或application/json),否则substitute规则不生效;常见失效原因是未配置addoutputfilterbytype注册输出过滤链,导致规则仅定义而未触发。

必须启用 mod_filter 和 mod_substitute,且响应体要明确声明 MIME 类型(如 text/html 或 application/json),否则规则完全不生效。
为什么Substitute指令写了却没反应
最常见原因是漏掉了输出过滤链注册——Substitute 指令本身只是定义规则,不自动触发处理。Apache 必须知道“对哪些响应类型启用替换”,这靠 AddOutputFilterByType 完成。
- 确认模块已加载:
a2enmod substitute filter,然后重启 Apache - 不能只写
Substitute "s/foo/bar/g"就完事;必须配合AddOutputFilterByType SUBSTITUTE text/html application/json - 后端返回
Content-Type: application/json; charset=utf-8时,Apache 默认不匹配带参数的类型,得写成AddOutputFilterByType SUBSTITUTE application/json(忽略charset部分) - 如果用
<location></location>块但没加AddOutputFilterByType,规则形同虚设
JSON 中脱敏身份证、手机号等字段怎么写正则
Apache 的 mod_substitute 不支持 \d、不支持跨行匹配、分隔符和引号必须手动转义,直接照搬 JS 或 PCRE 正则会失败。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 双引号是分隔符,所以
"idCard":"11010119900307251X"要写成\"idCard\":\"[0-9]{17}[0-9X]\" - 斜杠在手机号里(如
"phone":"/138****1234/")会导致解析中断,改用#当分隔符:Substitute "s#\"phone\":\"[0-9]{11}\"#\"phone\":\"****1234\"#g" - 默认按行处理,遇到换行缩进的 JSON(pretty-print)会断开匹配;加
i标志并禁用压缩:SetEnv no-gzip 1 - 别依赖
\b锚定单词边界——Apache 不支持,改用前后固定字符串,例如\"idCard\":\"[0-9]{17}[0-9X]\"比\bidCard\b可靠
替换后内容被截断或乱码怎么办
本质是编码与缓冲冲突:Apache 在 chunked 编码或 gzip 压缩后才做替换,导致正则错位或字节损坏。
- 强制后端返回明确的
Content-Type: text/html; charset=utf-8,避免 Apache 猜错编码 - 禁止响应压缩:
SetEnv no-gzip 1(尤其对 JSON/HTML 替换必须加) - 不要用
s///n以外的标志,n表示单行模式(.匹配换行符),否则点号无法跨行,容易只匹配半句就终止 - 避免匹配中文文本——正则易受编码影响,优先替换 ASCII 字段名、URL、ID 等,如把
src="/static/换成src="https://cdn.example.com/
真正难的不是写正则,而是让 Apache 在正确时机、以正确编码、对正确格式的响应体执行它——任何一环断开,Substitute 就静默失效。调试时打开 LogLevel debug 并查 error_log,比反复改正则更省时间。









