先给结论:同一URL在未登录桌面端返回404、在已登录移动端返回200,不能直接判定为“死链误报”或“链接正常”。正确做法是先确认差异是否由Cookie、User-Agent或权限中间件引起,再决定是修链接、修规则,还是把该地址从死链清单中排除。判断依据不是“哪个结果看起来对”,而是“目标用户实际会拿到哪个响应”。
同一地址返回不同内容,常见原因只有三类,对照方法也不同。
区分这三类,直接决定下一步动作。缓存层问题改缓存键或刷新缓存即可;权限层问题要确认该地址是否应对爬虫开放;渲染层问题通常不影响死链判定,但要确认关键内容是否在初始HTML中。
如果业务本身要求登录才能访问,未登录返回404或302是预期行为,不应把该地址当作死链处理。
此时应执行的动作是:用一组已授权的测试账号,在固定设备、固定网络下请求该地址,记录状态码、响应头和最终可见内容。如果已登录状态稳定返回200且内容正确,就把该地址从死链清单移入“受保护地址”列表,并在后续巡检中跳过未登录请求。
例外情况有两种。一是该地址本应作为公开入口,却因权限配置错误只对登录用户开放,这时要修权限而不是改清单。二是登录后仍返回404,说明资源确实不存在,按真实死链处理。这里的关键不是“登录后能打开”就结束,而是确认该地址在业务上是否应该公开。
如果该地址对所有用户都应可见,却只在某一类设备上返回404,优先怀疑缓存键或服务端设备判断逻辑。
实施动作分三步。第一步,固定登录状态为未登录,分别用桌面和移动User-Agent请求同一地址,保存完整响应头,重点看Vary、Cache-Control和Location。第二步,如果Vary中缺少User-Agent或Cookie,说明缓存可能串了版本,需要调整缓存键后刷新。第三步,重新请求两类设备,确认状态码一致。
这个动作的结果会直接影响下一步:如果调整缓存键后两类设备都返回200,问题属于缓存配置,不需要改链接;如果调整后移动端仍返回404,说明服务端存在设备分支逻辑,需要开发确认该分支是否应返回404,还是应返回同一内容。
假设例子:某地址在桌面端返回200,在移动端返回404。假设原因是CDN按User-Agent缓存了错误版本,调整缓存键并刷新后移动端恢复200。这个结果说明死链清单中的该条目应移除,同时把缓存键规则加入巡检项。如果刷新后仍为404,则不能移除,应继续排查服务端逻辑。
同一地址不同结果,必须同时记录以下信息,否则无法复查。
这些证据的作用是区分“状态码不同”和“内容不同”。一个地址可能两类设备都返回200,但移动端实际展示的是登录引导页,这仍然属于内容不一致,需要按权限或渲染问题处理。反过来,一个地址在未登录时返回302到登录页,登录后返回200,这是正常的权限控制,不应记为死链。
建议按以下顺序判断,避免把权限问题误判为死链,也避免把真实死链误判为正常。
Vary,再查服务端设备分支。需要提醒的是,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。如果该地址已公开且返回404,仅靠robots.txt阻止抓取,并不能保证它从索引中消失。此时更实际的动作是返回正确的404或410状态,并更新指向该地址的内部链接。
最后,把每种条件的判断结果写回巡检规则:受保护地址跳过未登录请求,公开地址要求多设备状态码一致,缓存相关字段纳入定期检查。这样下一次同一地址再出现设备间差异时,才能直接按条件对照,而不是重新争论哪个结果才算正常。