记录一下那天晚上的排查过程。站点给图片开了防盗链,valid_referers 里只写了本站域名。百度快照页打开后图片全部裂开,只剩文字排版。日志里 referer 是百度域名的图片请求清一色 403。

刚开始盯着「CDN 层也配了一份同样的规则,源站放行后边缘仍然拦」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。防盗链白名单没有包含快照代理的域名,请求一律被拒。也可能是空 referer 被直接拒绝,而快照代理经常不带 referer。

不容易想到的是,快照代理的 UA 被 WAF 当成采集工具。

从日志里找出被拦的 referer 是什么

awk '$9==403 && $7~/uploads/{print $11}' access.log | sort | uniq -c | sort -rn | head

接着在防盗链规则里放行快照域名和空 referer

valid_referers none blocked server_names *.baidu.com;

同步修改 CDN 层的规则,别只改源站

curl -sI -e 'https://www.baidu.com/' https://www.example.com/uploads/a.jpg | head -3

剩下的就是用带百度 referer 的请求验证图片能正常返回

curl -s -o /dev/null -w '%{http_code} %{size_download}\n' -e 'https://www.baidu.com/' https://www.example.com/uploads/a.jpg

改完先别撤,确认这几项。带百度 referer 的图片请求返回 200 且字节数正常,快照页里的配图恢复显示。

防盗链放行快照域名不会带来多少流量成本,但会直接影响用户点进快照后的第一印象。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189