mod_filter是调度模块,需按声明(filterdeclare)、匹配(filterprovider)、启用(setoutputfilter/filterchain)三步顺序配置;filterdeclare与filterprovider必须成对且名字一致,匹配依赖响应头字面值,大小写敏感,多条件支持布尔运算,provider限制须手动兜底。

Apache 的 mod_filter 不是直接干活的模块,它是个“调度员”——真正处理响应内容的是它背后挂载的过滤器(比如 mod_substitute、mod_deflate、mod_ext_filter)。要让流水线跑起来,关键不是写多少规则,而是把声明、匹配、启用这三步串对。
FilterDeclare 和 FilterProvider 必须成对且顺序固定
FilterDeclare 只是起个名字,没逻辑;FilterProvider 才真正绑定一个过滤器模块和触发条件。两者缺一不可,且必须在 SetOutputFilter 之前完成。
- FilterDeclare 后面的名字(如 json_prettify)要和 FilterProvider 的第二个参数完全一致
- FilterProvider 第三个参数是匹配表达式,支持 Perl 兼容正则:resp=Content-Type $application/json 中的 $ 表示“以…开头”,不是字面美元符
- 若用环境变量控制(如只在调试时启用),写成 env=DEBUG,再配合 SetEnvIf 或 RewriteRule [E] 设置该变量
匹配条件要和真实响应头严格一致
mod_filter 不猜、不推断,只做字面匹配。后端返回 Content-Type: application/json; charset=utf-8,而你写 resp=Content-Type $application/json,这是能匹配上的;但若写成 $json 或漏掉 application/ 前缀,就静默跳过。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 大小写敏感:必须和响应头里实际拼写一致(通常 MIME 类型小写)
- 多条件可用布尔运算:resp=Content-Type $text/html && env=ENABLE_MINIFY
- 对 JSON 脱敏等场景,别依赖扩展名(.json),只认响应头里的 Content-Type
FilterChain 和 SetOutputFilter 要在同一作用域生效
FilterChain 是开关,决定启用哪些已声明的 provider;SetOutputFilter 是挂载指令,但它不会自动识别未声明的 filter 名。常见错误是在全局声明了 FilterDeclare mysub,却在
- 推荐写法:把 FilterDeclare、FilterProvider、FilterChain、SetOutputFilter 都放在同一个
或 块里 - FilterChain 支持叠加:FilterChain mysub json_prettify 表示同时启用两个 provider,执行顺序按列出顺序
- 如果在 .htaccess 中使用,确保 AllowOverride 包含 Filter
底层 provider 的限制必须提前兜底
mod_filter 只转发,不解析。内容是否可处理、编码是否兼容、流是否完整,全由被调用的 provider 自己负责。
- mod_substitute 默认只处理 text/* 类型,想处理 application/json,得加 FilterProtocol substitute change=,并在 FilterProvider 中明确匹配该 MIME 类型
- mod_ext_filter 调用外部脚本时,程序必须从 stdin 读完全部字节、原样或修改后写到 stdout,不能残留输入、不能阻塞等待;建议加 timeout=3 和 logStderr
- 静态文件(如 .jpg)默认走 sendfile,会绕过所有输出过滤器;需显式配置 EnableSendfile Off 和 EnableMMAP Off









