mod_reflector仅在非空请求体且显式配置sethandler reflector时生效,需配合reflectorheader反射头,禁用proxypass等互斥指令。

mod_reflector 不是通用代理或调试工具,它只在请求体(POST/PUT 等)存在且明确启用 handler 时才生效;直接配 ProxyPass 或 Redirect 完全无效。
确认 mod_reflector 已正确加载并启用 handler
很多用户配置完 LoadModule reflector_module 后仍收不到反射响应,根本原因是没触发 handler。mod_reflector 不监听路径自动转发,必须显式用 SetHandler reflector 激活。
- 检查模块是否加载成功:
apachectl -M | grep reflector,应输出reflector_module (shared) - 确保配置块中包含
SetHandler reflector,否则请求会走默认处理流程,mod_reflector完全不介入 - Apache 2.4+ 要求
Location块内不能混用AllowOverride或旧式访问控制指令,推荐统一用Require all granted - 如果使用
.htaccess,需确认AllowOverride允许FileInfo和Indexes类指令,否则SetHandler会被忽略
反射请求体:必须发送非空 body 并匹配 Content-Encoding
mod_reflector 默认只反射请求体(REQUEST_BODY),但前提是 body 非空且未被其他模块提前消费。常见失败场景是浏览器 GET 请求或 curl 未带 -d 参数。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 测试命令必须带 body:
curl -X POST http://localhost/compress -H "Content-Encoding: gzip" -d "hello world" - 若配置了
SetOutputFilter DEFLATE,但请求头缺Content-Encoding: gzip,filter 不会执行,返回原始 body(未压缩) - body 被
mod_security、mod_rewrite的[E]标志或自定义 filter 提前读取后,mod_reflector将收到空 body —— 这是 Apache 请求生命周期决定的,无法绕过 - GET 请求永远无法触发 body 反射,因为 HTTP 规范下 GET 不应含 body;用 POST/PUT/PATCH
反射请求头与响应头:ReflectorHeader 指令不可少
默认情况下,mod_reflector 不复制任何请求头到响应中。想验证 header 透传或做简单回显测试,必须显式声明 ReflectorHeader。
- 只反射单个 header:
ReflectorHeader User-Agent→ 响应中出现User-Agent: curl/8.5.0 - 重命名 header:
ReflectorHeader X-Request-ID X-Reflected-ID→ 请求带X-Request-ID: abc123,响应含X-Reflected-ID: abc123 - 不支持通配符或正则;每个要反射的 header 都得单独写一行
ReflectorHeader -
ReflectorHeader必须放在同一Location块内,且在SetHandler reflector之后,否则不生效
常见误用:和 mod_proxy / ProxyPass 混用导致静默失效
有人试图在 Location 块里同时写 SetHandler reflector 和 ProxyPass,结果请求既没被反射也没被代理 —— 因为 handler 和 proxy 是互斥的处理分支。
-
SetHandler reflector表示“本请求由 reflector 处理”,后续所有 proxy 指令被跳过 -
ProxyPass属于mod_proxy的指令,仅在 handler 为proxy-server或未设置 handler 时起作用 - 想实现“先反射再代理”?不行。Apache 不支持 handler 链式调用;
mod_reflector的设计定位就是“把 filter 当服务用”,不是中间件编排工具 - 真需要动态路由 + 反射,得用
mod_lua或外部 CGI,而不是硬凑mod_reflector
最易被忽略的一点:mod_reflector 对请求方法无限制,但对请求体存在性极其敏感 —— 它不关心你是 POST 还是 CUSTOM_METHOD,只检查 r->read_length 是否 > 0。所以测试前务必用 curl -v 看实际发了什么,别只信 Postman 界面显示的“Body”标签页是否点亮。










