蜘蛛每次抓取一个 URL,服务器返回的状态码就是它对页面状态的第一手判断。同一个页面,返回 200 还是 404,返回 301 还是 302,后续的处理路径完全不同。很多收录问题追根溯源,不是内容质量的问题,而是状态码用错了。
状态码和收录是两件事,但先有关联
抓取和收录不是一回事:蜘蛛能抓到,不代表会收录。但状态码决定了蜘蛛下一步要不要继续抓、要不要保留已有索引。可以粗略理解为,状态码告诉蜘蛛“这个地址现在还有没有效”,收录和索引是后续基于内容再做的判断。所以状态码属于前置环节,一旦弄错,后面的优化都在错误的基础上进行。
常见状态码对收录的影响
200:正常内容
返回 200 表示页面可用,蜘蛛会正常解析内容。需要注意的是,200 只说明地址有效,不代表内容有价值。一个空页面、一个只有模板没有正文的页面,同样可以返回 200。
301:永久跳转
301 是告诉蜘蛛“这个地址已经永久换到新地址”,权重和索引通常会被传递到目标 URL。改版、合并页面、换域名时用 301 是正确做法。注意跳转链不要过长,A 到 B 再到 C 这种多级跳转会稀释传递效果,理想状态是一步到位。
302、307:临时跳转
临时跳转的本意是“地址暂时变了,之后还会回来”。如果拿 302 做长期跳转,蜘蛛可能仍保留原 URL 的索引,也可能反复抓取原地址。需要长期生效的跳转,应改用 301。
404:地址不存在
404 表示这个地址确实找不到对应内容。对于已删除且不打算恢复的页面,返回 404 是合理的。蜘蛛抓到 404 后会逐步把该 URL 从索引中移除,只是这个过程需要时间,不会立刻生效。
410:地址已永久删除
410 和 404 的结果类似,但语义更强,明确表示永久删除、不会回来。理论上蜘蛛处理 410 的速度会快一些,实际差异并不总是明显。如果一个 URL 有大量外链,或者你希望它尽快退出索引,用 410 是更明确的表态。
5xx:服务器错误
500、502、503 表示服务器端出了问题。偶发的 5xx 蜘蛛会稍后重试;如果持续返回 5xx,蜘蛛会降低抓取频率,已经索引的页面也可能暂时从结果中消失。503 的正确用法是主动维护:加上 Retry-After 头,告诉蜘蛛多久之后再来,避免它把暂时不可用误判为永久失效。
要点:状态码描述的是“地址的状态”,不是“内容的质量”,两者要分开判断。
软 404:返回 200 但内容无效
比状态码写错更常见的,是软 404:页面返回 200,但内容是空的、报错的,或者只有一句“该商品已下架”。蜘蛛拿到的是 200,会当成正常页面处理,于是一个没有价值的 URL 被反复抓取,甚至进入索引,长期占着抓取资源。
自查方法很简单:把页面正文抓取下来,看是否有实质内容。如果页面实际已经无效,就应该返回 404 或 410,而不是继续用 200 硬撑。
删除页面时的选择顺序
- 先确认这个 URL 是否还有替代页面。有替代,用 301 指过去。
- 没有替代、且确定不再恢复,用 404 或 410。
- 只是暂时下线,用 503 加 Retry-After,不要用 404。
- 页面还在但内容已失效,先改内容或状态码,不要让它继续以 200 存在。
几个容易被忽略的细节
- 状态码要真实。用 JS 或前端路由“伪造”的 404 页面,服务器实际返回的仍是 200,蜘蛛看到的也是 200。
- 跳转目标要是可索引地址。301 跳到一个 404 或一个 noindex 页面,等于白跳。
- 别用 robots.txt 屏蔽要删除的页面。屏蔽后蜘蛛抓不到状态码,反而无法确认页面已失效,索引可能长期保留。
- 修改后需要时间生效。索引更新不是即时的,改完继续观察即可,不需要反复改动。
总结一句:状态码是给蜘蛛的第一层信号,先把这一层写对,再去谈内容质量和内链,很多收录问题会少一半。改完之后定期核对索引状态,比每天盯着数值波动更有意义。