这类问题我又碰上了一次。中文长标题生成的地址编码后有 260 多个字符,WAF 的 URI 长度规则设的是 200,这批页面全部返回 403。日志里百度蜘蛛的 403 一天三百多条,搜索后台显示无法抓取。

第一反应是「403 页面被当成正常响应 没有单独告警」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。WAF 的 URI 长度阈值低于站点的实际地址长度;中文 slug 编码后长度膨胀到三倍;长度规则只对蜘蛛 UA 生效 用户访问看起来正常。

上来先找一条被拦的长地址

awk '$9==403 {print $7}' access.log | awk 'length($0)>200' | head -3

再往下用百度 UA 复现返回码

curl -s -o /dev/null -w '%{http_code}\n' -A 'Baiduspider' 'https://www.example.com/p/长标题地址'

然后把 URI 长度阈值调到 1024

SecRule REQUEST_URI '@gt 1024' 'id:1001,deny'

复验长地址的返回码

curl -s -o /dev/null -w '%{http_code}\n' -A 'Baiduspider' 'https://www.example.com/p/1'

中途换过一次思路,把范围缩到最小的那一层,反而快了。

恢复的判定其实很直接。长地址返回 200,日志里 403 的蜘蛛请求归零。

中文站要把编码后的长度算进去,按字符数设阈值一定会误伤。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189