先分清软 404 和空壳页
软 404 指的是服务器返回 200,但页面实际内容已经不存在或没有意义。空壳页更偏向前端层面:模板、导航、页脚都正常渲染,主内容区却是空的,或者只剩一句"暂无数据"。
两者共同的问题是:从状态码看它们像正常页面,蜘蛛会把它当成可索引的内容记录下来,并且以后还会回来复查。
蜘蛛遇到它们时会发生什么
状态码是 200,抓取队列里它就是一个有效目标。蜘蛛进来发现内容很薄,不一定会立刻放弃,往往会隔一段时间再来看一次,确认内容是否会补上。这个过程反复发生,占用的就是本来可以给新页面的抓取时间。
另一个影响在内链上。如果导航、相关推荐、列表页里还挂着这些地址,页面上有限的链接位置就被占用了,真正想被发现的页面反而拿不到入口。
软 404 不会让页面立刻从索引中消失,它的代价是持续消耗抓取频次,而不是一次性的报错。
常见成因
- 筛选与排序组合:多条件叠加后没有结果,但框架照常渲染,返回 200。
- 商品或内容下架:数据被删除,URL 仍然可访问,只剩标题和空描述。
- 权限或状态限制:草稿、已归档、未授权的内容,模板依然输出空壳。
- 分页越界:翻到超出末页的页码,页面还能打开,列表却是空的。
- 单页应用路由未命中:任何路径都返回同一个外壳,路由匹配失败时首屏没有内容。
- 内容依赖异步加载:首屏 HTML 里没有正文,脚本执行失败或接口超时后就成了空页。
怎么自查
最直接的信号来自抓取日志。把返回 200 的 URL 按响应体大小排一下序,字节数明显偏低的一批,往往是空壳页。再结合渲染后的文本长度,比只看源码更接近蜘蛛实际看到的内容。
还可以观察同一批 URL 的回访间隔。如果某些地址被反复抓取、内容始终没有变化,值得单独拎出来看。
站内搜索和筛选参数最容易批量制造这类地址,可以先统计这类 URL 的数量级,再判断是否需要收口。
处理方式与取舍
状态码要诚实
内容确实不存在,就返回 404;确定永久移除,用 410 也可以,两者在抓取处理上差别不大。临时不可用的,用 503 并配合 Retry-After,比返回一个空白的 200 更清楚。
canonical 不能替代状态码。它表达的是一组相似页面中的首选,而不是"这个页面没有内容"。
给无结果页留出口
筛选没有结果时,除了提示信息,可以给出同一类目的热门入口或相关标签。这样即使页面本身内容薄,蜘蛛也有一条向前走的路,而不是撞到死胡同。
分页与路由的边界
超出末页的分页地址,不要在内链里生成,直接返回 404 也行。单页应用要为未命中的路由设置明确的响应状态,不要所有路径都回同一个 200 外壳。
内链与 Sitemap 的配合
- 先从导航、相关推荐、列表页里摘掉这些地址,让入口不再流向它们。
- Sitemap 只保留希望被索引的 URL,不要把空壳页也写进去。
- 确实需要暂时屏蔽的,可以用 noindex,但要注意它和 200 并存时的表现,也不要再放进 Sitemap。
- 被合并的内容,用 301 指向新的主页面,让旧地址的访问有明确去向。
几个容易忽略的细节
有些空壳是暂时性的,比如库存补上之后内容会回来。这类页面如果直接 410,恢复时会比较麻烦;可以先保留地址,但不要让它出现在内链和 Sitemap 里。
内容依赖脚本渲染的站点,最好在首屏 HTML 里就带上关键信息,减少脚本失败后整页变空的情况。
处理完之后,隔一段时间再抽一批日志看看:返回 200 的 URL 里,低字节数的比例有没有下降,回访模式有没有变化。软 404 的清理通常不是一个动作,而是一轮一轮收窄的。