这个坑值得记一笔。源站对未带正确 Host 的请求返回 403,CDN 回源时用了节点 IP 作为 Host,边缘拿到 403 后仍向蜘蛛返回 200,正文是空字符串,日志里全是 200 却没有字节。
刚开始盯着「WAF 对回源 IP 段做了拦截,源站直接返回 403」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。CDN 回源 Host 配置成 IP,源站虚拟主机匹配不到站点;边缘把回源错误包装成 200 空响应,状态码被吞掉;缓存里存了这份空响应,后续请求一直命中。
动手时先对比边缘与源站的状态码
curl -sI https://www.example.com/post-1024/ | findstr /i "HTTP content-length x-cache"
随后绕过 CDN 直连源站验证
curl -sI -H "Host: www.example.com" http://203.0.113.10/post-1024/ | findstr /i HTTP
修正回源 Host 并放行回源 IP
curl -sI https://www.example.com/post-1024/ | findstr /i "HTTP content-length"
末了清掉已缓存的空响应
curl -X PURGE https://www.example.com/post-1024/
怎么算真的好了,看的是同一批现象。回源 Host 改对后,边缘返回的正文长度恢复正常,日志里的空 200 记录消失。
容易忽略的是,200 加上空响应是最难发现的一类故障,监控只看状态码的话会一直显示站点正常。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
