状态码说 200,内容却说“没有”
日志里一排 200,看起来一切正常;真正打开页面,首屏只有一句“暂无相关内容”或者一个空列表。这类页面在技术上不算报错,但在收录判断上属于软 404——服务器告诉爬虫“这里有东西”,页面本身却什么都没提供。
软 404 不等于错误页。它更像一种空壳:URL 可访问、状态码正常、模板完整,唯独主体内容缺失。搜索蜘蛛抓下来之后,会重新判断这个页面值不值得进索引,多数情况下不进,或者进了也不展示。
判断一个页面是不是软 404,不看状态码,看它被抓下来之后有没有可读的内容。
软 404 常从这几类页面来
- 站内搜索结果页:没有命中时返回空列表,状态码仍是 200。
- 空分类、空标签、空归档:栏目建好了,内容还没填。
- 筛选与参数组合页:多重条件叠加后没有任何符合的结果。
- 商品或内容下架页:原 URL 还在,内容被撤掉,只剩模板框架。
- 需要登录或权限的页面:未登录用户拿到的是一个空容器。
- 依赖 JS 渲染的页面:首屏 HTML 里是空的,内容靠脚本填进去。
第一步:先分清“暂时为空”和“确实没有”
- 抽样打开页面,看首屏到底有没有有效信息,别只看状态码。
- 查看未执行脚本时的 HTML,确认服务端实际返回了什么。
- 在日志里按模板或 URL 规则统计,看这批页面是零星几个还是一整类。
- 查这个 URL 是否曾经有过流量或外链,有过的话处理方式要更谨慎。
处理顺序:先分类,再决定留、改、还是下线
值得保留的,把内容补上
如果这类页面有搜索需求、有内链入口、后续会持续产出内容,就别急着让它消失。补上推荐条目、相关分类或导流模块,让它从空壳变成可用页面。
确实不该留的,用真实的状态码
下架的商品、作废的活动页、彻底不做的栏目,应该返回真实的 404 或 410,而不是用 200 加一句“内容不存在”。前者是明确信号,后者只会让爬虫反复来抓一个空页面。
参数与筛选类,从入口收敛
筛选组合理论上可以生成无数个 URL,大多数组合都没有单独收录的价值。与其让它们各自返回 200,不如从入口上收敛:限制可被抓取的参数、用 canonical 指向主列表页、必要时在 robots.txt 里挡住没有意义的组合。
几个容易踩的坑
- 把软 404 当成“页面没问题”,只改文案不改信号。
- 一刀切把空页面全部 404,连本来该保留的入口也一起处理掉了。
- 前端路由的应用里,不存在的路径也返回 200,用户看到自定义提示页,爬虫看到的是正常页面。
- 只处理 PC 模板,忽略移动端或另一套渲染方式。
- 改完不复查,旧链接仍被外链和站内引用,继续产生 200 空页。
怎么盯住它,别让它再长回来
- 按模板建立抽查清单,新上线的分类页、筛选页、搜索结果页都过一遍。
- 在日志里定期看“200 但内容极少”的 URL 占比,出现增长就去找来源。
- 把站内搜索、筛选、下架这三类当作重点监控对象,它们最容易批量产生软 404。
- 改动之后隔一段时间再看一眼,确认这些 URL 没有再被频繁抓取。
软 404 的麻烦之处在于它不报警:状态码正常、页面能打开,问题只会在抓取与索引的统计里慢慢显现。定期抽查几类高危模板,比事后大批量清理省事得多。