先给结论:不要用“一台设备看到什么”来判定这个地址是404还是正常页,而要先固定一个可复现的请求身份,再逐项改变设备、登录态和请求头,把每次响应记录成可对照的证据。只有当同一身份、同一请求条件下返回稳定一致的状态码,这个对照才成立;否则你看到的是条件差异,不是地址本身的404。
同一地址出现差异,通常来自三个层面,处理方式完全不同。
这三类的证据形态不同:第一类看响应头和响应体差异,第二类看请求头与路由规则,第三类看缓存键和回源记录。混在一起对照,只会得到互相矛盾的结论。
选择未登录、桌面端、无特殊Cookie的请求作为基准,是因为它最容易复现,也最接近搜索引擎抓取时的默认状态。用命令行工具记录完整响应,而不是只看浏览器渲染结果。
一个可用的记录方式:
curl -sS -D - -o /dev/null -A "Mozilla/5.0" https://example.com/path
把响应头中的状态行、Cache-Control、Vary、Set-Cookie、Location逐项抄下来。然后只改一个变量:加登录Cookie、换移动UA、改Accept-Language,各跑一次。每次只改一个变量,是让差异可归因的前提。
如果基准请求返回404,而加登录Cookie后返回200,那么问题不在地址是否存在,而在于权限分支把未登录访问当成了“资源不存在”。这时下一步不是改404页面,而是检查服务端为什么用404而不是401或403来表达无权限。
对照清楚之后,你要决定这个地址怎么处理。三种做法各有明确的适用条件。
适用前提:内容确实存在,只是部分条件下被错误地返回404。代价是需要改动服务端或路由逻辑,并回归测试所有条件组合。动作是让无权限返回403、让不存在返回404,两者不再混用。结果会直接影响后续监测:如果状态码不再随登录态漂移,监测脚本才能用单一身份稳定判断。
适用前提:这个地址对应的内容已经迁移,且新地址对所有访问条件都返回一致结果。代价是必须确认旧地址在所有设备与登录态下都执行同一跳转,否则301和404会交替出现。动作是用301指向新地址,并验证跳转不依赖Cookie。结果决定了旧地址能否退出监测清单。
适用前提:内容已彻底下线,且没有任何条件分支需要保留。代价是放弃该地址可能积累的入口价值。动作是确保所有条件下都返回404,而不是有时200有时404。结果是可以把它从对照清单移除,但前提是确认没有缓存层仍在返回旧内容。
假设某地址在桌面浏览器返回404,在移动端返回200。仅凭这一点不能断定移动端是“正确版本”。合理的下一步是:用同一移动UA、不带登录Cookie再请求一次。如果仍返回200,说明差异来自UA路由;如果变成404,说明差异来自登录态而非设备。这两种结论指向完全不同的修复位置。
再假设加了登录Cookie后返回200,但响应体是一个登录提示页。这说明200并不代表目标内容可达,只代表服务端选择了一个页面来响应。此时把200当作“地址正常”会掩盖真实问题。对照时要把状态码和响应体一起看,不能只看其中一个。
证据要能回答“在什么条件下、返回了什么”。建议每次记录四项:请求身份(UA、Cookie有无)、请求时间、状态码、关键响应头。把同一地址的多条记录放在一起,差异会自然显现。
需要注意两点。第一,抓取限制或移除请求不等于索引状态已经改变,状态码对照只能说明服务端行为,不能直接推断索引结果。第二,如果某个条件下抓取量或请求量归零,不能单独证明处理正确,也可能是监测身份变了、缓存命中变了或路由规则调整了。要结合其他条件的记录一起判断。
最后,不同搜索引擎对状态码和跳转的处理并不完全一致,涉及多引擎时须分别核查,不要用一次对照结果覆盖所有情况。