不少人判断一个页面是否还有价值,看的是它能不能打开。只要浏览器里能看到东西、状态码是 200,就觉得这页还在、还算数。但搜索引擎看的不只是状态码,还要看页面里到底有没有内容。当一个 URL 返回 200,正文却只剩一句“没有找到相关结果”或“该商品已下架”,它就变成了典型的软 404。
软 404 和真 404 的区别在哪
真 404 是服务器明确告诉爬虫:这个地址没有东西了。软 404 则相反,服务器说“一切正常”,但页面内容其实是空的。爬虫只能把 HTML 抓回去,再靠内容判断,这个过程比读一个状态码慢得多,也更容易判断失误。
结果就是两种麻烦:一是这类空页面可能被当成薄内容放进索引;二是即使没有被收录,它也可能因为内链一直在、URL 一直可访问,而被反复抓取。
软 404 通常从哪里冒出来
- 筛选、排序、多条件组合之后没有匹配结果,模板照样渲染出一个 200 页面;
- 商品下架、活动结束、文章被撤,但列表页和面包屑还链着旧地址;
- 空分类、空标签页、自动生成的聚合页;
- 站内搜索结果页,尤其是用户搜了一个没有结果的词之后产生的 URL。
这些页面的共同点是:模板是统一的,状态码是统一的,只有数据库里有没有数据不一样。开发不特意处理,服务器就会一律返回 200。
自查:怎么把软 404 找出来
- 先从日志里挑抓取频次高、又明显没有业务价值的 URL,看它们是不是集中在某几个模板上。
- 在搜索后台的页面报告里,关注那些“已编入索引”但点进去没有实质内容的地址。
- 用抓取工具批量请求一批样本,把状态码和正文字数放在一起比对,重点看 200 且正文极短的那一档。
- 按模板归类,而不是一个 URL 一个 URL 地看。软 404 基本是模板问题,不是单页问题。
处理方式要看页面本身的性质
内容确实不存在了
下架的商品、结束的活动、撤掉的文章,如果确定不会再恢复,返回 410 或 404 都比留着一个 200 的空壳清楚。搜索引擎拿到明确信号后,清理速度通常比靠内容判断要快。
只是暂时没有结果
比如季节性的分类、暂时缺货的列表页,将来还会重新有内容。这类页面可以继续返回 200,但建议加上 noindex,同时在页面上给出替代入口,比如回到上一级分类或推荐同类内容。等数据恢复后再去掉 noindex,页面本身不用换地址。
筛选和排序参数
参数组合可以无限生成,其中大部分组合没有搜索需求。常见做法是只让有实际内容的筛选组合被访问,其余组合要么不生成链接,要么收敛到上级分类页,要么用 noindex 挡在索引之外。这里要注意,robots.txt 屏蔽只能挡住抓取,挡不住索引,如果页面已经被外部链接指向,仍然可能出现在结果里。
站内搜索结果页
这类页面价值参差。如果站内搜索是你站点的重要功能,别人会主动搜你的品牌加关键词来找,那不妨保留一部分;如果只是模板自动生成、内容拼凑,通常屏蔽或 noindex 更合适。
不要把整站某个分类一刀切地 noindex。先问一句:这个页面有没有独立的搜索需求?有需求却被挡住,损失的是流量,不只是收录数量。
几个容易踩的坑
- 用前端 JS 在无结果时才渲染提示文案。如果爬虫执行 JS 的能力有限,它看到的可能就是一个完全空白的 HTML,这比服务端直接返回提示更糟。
- 页面已经 noindex,但列表页和导航里还挂着大量指向它的链接。爬虫仍会不断发现和抓取这些地址,浪费的是抓取份额。
- 把软 404 当成收录问题来处理,反复提交站点地图、反复推送,其实问题出在页面本身没有内容。
- 只改状态码,不改内链。地址返回 404 了,但入口链接还在,用户和爬虫还是会一再来撞。
软 404 说到底是一个一致性问题:状态码、页面内容、内链入口,三者应该讲同一个故事。定期按模板核对一遍这三者是否对得上,比事后一页页清理要省力得多。