先给结论:不要急着改服务器。同一URL在不同设备或登录状态下返回不同内容,通常说明差异出在请求特征或会话状态上,而不是404本身。正确做法是先用可对照的请求把差异复现出来,再决定是保留现状、改写响应,还是退出当前修复路线。下面给出可核对的判断依据和取舍条件。
同一URL并不等于同一请求。设备类型、User-Agent、Cookie、登录令牌、Accept-Language、Referer都可能触发不同分支。要对照,就要固定变量:
如果未登录返回404、登录后返回200,说明服务端按会话做了分支;如果桌面返回404、手机返回200,说明差异可能来自UA识别或移动端路由。这两种情况的修复动作完全不同,不能混为一谈。
保留适用于差异是有意设计的情况。例如未登录用户本就不该看到该资源,返回404是合理的隐藏手段。此时前提是:该地址不用于对外分发,也不在站点地图或内链中大量出现。动作是确认没有把该路径当作公开入口,然后停止修改。结果是后续排查不再把它当作故障。
改写适用于差异是意外分支的情况。例如登录后200、未登录404,但该地址本应公开。前提是你能定位分支条件。动作是修改路由或权限判断,让公开路径对所有会话返回一致状态。结果是对照请求的状态码开始收敛,下一步可以复查是否还有缓存层残留旧响应。
退出适用于差异来自你无法控制的外部条件。例如不同设备返回不同内容是因为中间有第三方缓存或运营商注入。前提是你已确认源站响应一致,差异只在链路中出现。动作是停止在源站反复改配置,转向核对缓存与CDN策略。结果是避免把链路问题误修成站点问题。
不要只看“返回了404”这一个现象。以下证据能区分不同解释:
Vary 字段:若包含 User-Agent 或 Cookie,说明缓存按这些维度区分版本,差异可能是缓存策略造成的,而非源站逻辑。这些证据的作用是排除法。请求量或抓取量归零不能单独证明修复正确,它也可能是抓取预算转移、临时封禁或统计口径变化造成的。要结合上面的对照结果一起判断。
假设某路径 /member/report 在未登录时返回404,登录后返回200。不要立刻认为这是bug。先按上面的方法做对照:
若第3步回到404,说明分支由会话控制。此时若该路径本就只对会员开放,保留是合理选择;若它应对外公开,则需要改写权限判断。若第3步仍返回200,说明差异不来自登录状态,应转向检查缓存或UA分支。这个例子的数字仅用于说明对照方法,不代表任何真实站点结果。
选定保留、改写或退出后,用一个固定请求集复测:同一路径、同一设备、两种登录状态各请求一次,比较状态码与首屏可见内容。若差异消失,说明分支条件已被处理;若差异仍在,说明还有未固定的变量,应回到对照步骤而不是继续叠加修改。改动前保存原始响应头与响应体片段,便于回滚和复查。robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录,因此不要用这两者替代对响应一致性的验证。