Apache 的 ProxyAddHeaders On 仅透传 WAF 注入的响应头(如 X-APISIX-CHAITIN-WAF-ACTION),不自动生成;需确保 WAF 开启响应头注入、代理链完整、后端按 HTTP_X_APISIX_CHAITIN_WAF_ACTION 格式读取。

在 Apache 中配置 ProxyAddHeaders 向后端服务传递前端 WAF 的拦截状态,核心目标是让后端应用能感知请求是否已被 WAF 拦截(例如被拒绝、触发滑块、或放行),从而做日志记录、风控联动或动态响应。但需注意:*ProxyAddHeaders 本身不生成状态头,它只控制 Apache 作为反向代理时是否将自身添加的响应头(如 `X-Forwarded-`)透传给后端**;WAF 状态头必须由前端 WAF(如 Chaitin SafeLine、雷池、云厂商 WAF)主动注入,并通过 Apache 代理链正确转发。
以下是分步说明:
一、确认 WAF 已注入状态响应头
主流 WAF(如 Chaitin WAF、腾讯云 WAF、阿里云 WAF)默认会在响应中添加识别性 Header,例如:
-
X-APISIX-CHAITIN-WAF-ACTION: reject(被拦截) -
X-APISIX-CHAITIN-WAF-STATUS: 403 -
X-WAF-Status: blocked(部分厂商自定义)
你可通过 curl 或浏览器开发者工具检查原始响应头,确认这些头存在且非空。若无,需先在 WAF 控制台开启「响应头透传」或「调试头」功能(如 Chaitin 的 append_waf_resp_header)。
立即学习“前端免费学习笔记(深入)”;
二、启用 Apache 反向代理并透传 WAF 头
确保已加载 mod_proxy 和 mod_proxy_http,并在虚拟主机或目录配置中启用代理:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
ProxyPreserveHost On ProxyRequests Off # 将请求转发到后端(如 PHP-FPM 或应用服务器) ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ # 关键:允许 Apache 将收到的响应头(含 WAF 头)原样转发给后端 ProxyAddHeaders On
⚠️ 注意:ProxyAddHeaders On 是默认行为(Apache ≥ 2.4.10),但显式声明更稳妥。它确保 Apache 不会剥离上游响应中的自定义头(如 X-APISIX-CHAITIN-WAF-ACTION),使后端能读取。
三、后端应用读取并使用该状态
后端(如 PHP)可直接通过 $_SERVER 或 getallheaders() 获取:
// PHP 示例
$wafAction = $_SERVER['HTTP_X_APISIX_CHAITIN_WAF_ACTION'] ?? '';
$wafStatus = $_SERVER['HTTP_X_APISIX_CHAITIN_WAF_STATUS'] ?? '';
if ($wafAction === 'reject') {
error_log("WAF 拦截请求,状态码 {$wafStatus}");
// 可记录审计日志、跳过业务逻辑、返回统一提示等
}若使用 .htaccess,也可用 SetEnvIf 提前捕获:
SetEnvIfNoCase X-APISIX-CHAITIN-WAF-ACTION "(.*)" WAF_ACTION=$1
再通过 $_SERVER['WAF_ACTION'] 访问。
四、常见问题处理
-
头名被转为大写+下划线:Apache 会将
X-WAF-Status转为HTTP_X_WAF_STATUS,PHP 中需用此格式读取。 - 头未透传:检查 WAF 是否部署在 Apache 前(如 CDN → WAF → Apache → 后端),确保路径上无中间设备(如 Nginx、CDN)剥离了自定义头。
-
开发环境验证:用
curl -I https://yoursite.com查看响应头是否含X-APISIX-CHAITIN-WAF-ACTION,再确认后端能否收到。
不复杂但容易忽略。















