现场是这样的。开启 HTTP/2 之后,部分蜘蛛的请求被 WAF 判成畸形包返回 403,同一地址用 HTTP/1.1 手工请求完全正常,日志里能看到协议版本字段。

中间走过弯路,把「CDN 回源用 HTTP/1.1,WAF 看到的协议和客户端不一致」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。WAF 引擎版本较旧,对 HTTP/2 的头部压缩解析有缺陷;伪头部里的 authority 与 Host 不一致被判异常;规则里按 Header 顺序匹配,HTTP/2 的顺序被打乱。

动手时先对比两种协议的返回码

curl -sI --http2 https://www.example.com/post/1024 | head -1; curl -sI --http1.1 https://www.example.com/post/1024 | head -1

再往下查看 WAF 日志里命中的协议字段

grep 'HTTP/2' /var/log/waf/audit.log | tail -20

升级 WAF 规则库或临时关闭该条规则

curl -s -X POST http://127.0.0.1:9000/api/rules/reload

回源侧固定协议版本验证

proxy_http_version 1.1;

改之前先确认了最近有没有人动过配置,避免白查一遍。

别只看报错消失,验证要多做一步。HTTP/2 与 HTTP/1.1 请求都返回 200,WAF 日志里不再出现协议解析错误,蜘蛛抓取量恢复。

这里还有个坑。协议升级要先在旁路观察 WAF 日志,直接全量开 HTTP/2 容易把解析缺陷暴露给蜘蛛。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189