排查收录问题时,常遇到一种情况:索引里能看到某个地址,但站内根本没有这个页面,点开要么是 404,要么跳回首页,要么显示一片空白。这类地址出现的原因不止一种,处理方式也不一样。如果一上来就提交删除,往往过一段时间又会冒出来。下面按核对顺序梳理一遍。
第一步:确认这个地址返回的真实状态码
索引里的记录和实际返回状态可能不一致,先别急着下结论。用命令行或浏览器开发者工具看响应头里的状态码,而不是只看页面长得像不像 404。
- 返回 404 或 410:服务器已经明确告知页面不存在,属于正常处理方式。
- 返回 200 但内容为空或只剩框架:这类“软 404”最容易被当成有效页面收录。
- 返回 301/302 跳到首页或列表页:搜索引擎会逐步把原地址替换成跳转目标,但如果跳转目标本身质量不高,原地址也可能保留。
- 返回 5xx 或超时:这是临时状态,通常不会导致收录,但会让抓取计划被推迟。
软 404 为什么会被收录
搜索引擎判断页面是否存在,主要依据状态码,而不是页面上的文字。如果一个不存在的地址仍然返回 200,页面上写着“抱歉,没有找到内容”,对爬虫来说这依然是一个正常页面,只是内容很薄。薄内容多了,既占用抓取资源,也会拉低整站的质量评价。
常见的软 404 场景包括:
- 自定义错误页直接返回 200。
- 单页应用把所有未匹配路由都渲染成空壳页,状态码却是 200。
- 商品下架或参数错误后,页面保留模板但没有任何数据。
- 站内搜索无结果时,仍然输出完整的页面结构。
判断标准很简单:内容是不是真的不存在?如果是,就应该让状态码也表达“不存在”,而不是只在页面文案里提示。
框架和路由的兜底返回容易被忽略
有些站点为了体验一致,把任何未匹配的路径都交给同一个入口文件处理,再由前端决定展示什么。这种写法在浏览器里看不出问题,但爬虫拿到的是一个状态码 200 的空壳。核对时可以随机造几个明显不存在的地址,比如在路径后加一串随机字符,看返回码是否仍然是 200。
索引里的地址也可能来自站外
并非所有被收录的地址都由本站生成。常见来源有:
- 历史遗留的旧 URL,改版后既没做跳转,也没返回 404。
- 外部网站抓取了带参数的链接并长期保留。
- 别人拼错或猜测的地址,被爬虫顺着外链尝试访问。
- sitemap 或内链里残留的失效地址。
如果服务器对任意地址都返回 200,就等于主动告诉爬虫“这个地址是存在的”,收录自然会发生。
建议的处理顺序
- 统计被收录但站内不存在的地址,按返回码分组,先处理返回 200 的那一批。
- 修正服务端逻辑,让不存在的地址返回 404,已彻底移除的地址建议返回 410。
- 取消首页或列表页的兜底跳转。跳转会让状态变得模糊,不利于索引清理。
- 清理站内残留入口:sitemap、内链、导航、面包屑里指向失效地址的链接。
- 确认返回码正确之后,再提交移除。顺序反了容易反复出现。
- 观察两到四周,看索引中的地址数量是否逐步下降,不必每天重复提交。
几个常见误区
- 用 robots.txt 屏蔽代替 404:robots 只阻止抓取,不会把已收录的地址从索引里拿掉,而且屏蔽之后爬虫也读不到 noindex 指令。
- 给错误页加 noindex 但不改状态码:短期可行,但页面仍然占用抓取资源,长期还是应该返回正确状态码。
- 把 404 全部改成 301 到首页:大量地址跳到首页会被视为软 404,效果和空壳页接近。
- 频繁提交删除:状态码没改之前,提交只是临时清掉展示,之后可能再次出现。
结论可以简化成一句话:让状态码如实反映页面是否存在,再谈收录和清理。收录状态是抓取、索引、展示三个环节共同作用的结果,不存在的地址被收录,多数时候不是搜索引擎判断错了,而是服务器一直在说“我这里有一个正常页面”。