先给结论:不要把测试工具的“成功”当成线上可用性的证据,而要把它当成一组待验证的假设。你要做的是从抓取日志里找出失败请求,再把那条请求的完整条件(IP、UA、DNS解析结果、TLS握手参数、请求头顺序、Cookie与重定向链路)逐项搬到测试环境里,能复现出同样的失败,才算真正定位了问题。如果搬不全,就说明你还没找到真正的分叉点,下一步不是改配置,而是继续补日志。
测试工具通常做了三件事:固定出口IP、简化请求头、忽略部分重定向或JS执行。这三件事恰好是很多线上失败的来源。常见分叉点包括:
Accept-Language、Sec-Fetch-*、Cookie会触发另一条规则。这些差异都不在“页面能不能返回200”这一层,而在“谁在什么条件下请求”这一层。所以复现的关键不是重复请求,而是重复条件。
抓取日志(无论来自CDN、源站还是WAF)通常能提供请求时间、状态码、IP、UA、路径、响应时间。你要从失败条目里抽出下面这组字段,作为复现清单:
注意:日志里IP和UA可能被脱敏或截断。如果关键字段缺失,优先推动补日志,而不是凭猜测改配置。抓取量或错误数归零不能单独证明问题已修复——它也可能是日志采样变了、流量被上游拦截了、或失败请求根本没到你这层。
拿到失败条件后,你通常面临三条路,选哪条取决于失败是否稳定可复现。
适用前提:你能拿到失败请求的出口IP或等价网络位置,且失败在时间上可重复。做法是用相同UA、相同请求头、相同DNS解析结果去请求同一路径。代价是需要能控制出口IP的环境,可能涉及代理或临时节点。如果复现成功,你就拿到了一个可反复触发的失败样本,后续任何修复都能用它做前后对照。
适用前提:出口IP无法复现,但你能改动请求头、Cookie、路径或解析目标。做法是固定其他条件,只改一个变量,观察状态码是否从失败变为成功。代价是结论只能说明“这个变量相关”,不能直接证明它就是线上失败的唯一原因。比如你改UA后成功了,只能说明该规则对UA敏感,还需要回到日志确认线上失败请求的UA确实命中了这条规则。
适用前提:失败是间歇性的,或依赖你无法获取的第三方网络条件。此时继续在本地硬凑条件成本过高,更合理的动作是在边缘层加一条针对该路径和状态码的监测,记录每次失败时的请求条件,等样本积累后再判断。代价是问题不会立刻解决,但避免了在错误假设上反复改配置。
假设抓取日志显示,某路径在移动网络下返回403,而你的测试工具返回200。日志里失败请求的UA是移动浏览器UA,成功请求是工具默认UA。你可以先固定路径、IP段和请求头顺序,只把UA换成移动浏览器UA再请求一次。
这个例子里,动作是“只改一个变量再请求”,结果是“失败是否被触发”,它直接决定下一步排查方向。数字只用于说明比较方法,不代表任何真实比例。
无论走哪条路,都要把复现条件写成可执行的记录:请求方法、完整URL、请求头、出口网络、解析目标、预期状态码。这样开发或运维接手时,不需要重新从日志里猜。同时要明确一点:复现成功不等于修复完成,它只证明你找到了一个能稳定触发问题的条件。修复后要用同一组条件再跑一次,确认失败不再出现,并且确认没有把正常请求一起拦掉。HTTPS、robots.txt或站点地图在这里都不构成直接证据——它们不保证抓取、不保证索引,也不能说明当前这条失败请求的真实原因。不同搜索引擎和CDN对同一条件的处理可能不同,涉及具体平台时须分别核查其文档与当前行为。