当一个本该返回 404 或 410 的旧页面在百度收录时间查询里仍显示“已收录”,而服务器返回的却是 200,问题通常不在收录本身,而在响应状态与页面内容已经不一致。核对顺序应该是:先确认服务器实际返回的状态码,再确认页面正文是否真的还有可被索引的内容,最后才判断这个 URL 该保留、该改内容,还是该让它彻底退出。
旧内容下线时最常见的矛盾是:页面已经没有任何实质信息,但系统仍然返回 200。这通常有两种解释。
这两种情况不能靠百度收录时间查询的结果来区分,因为收录状态只说明过去某个时间点被抓取过,不说明现在返回什么。必须回到响应本身。
区分两种解释的证据,是同一时刻的状态码与正文的对应关系。可以用命令行工具直接取响应头,再取正文,避免浏览器缓存或前端跳转干扰判断。
假设有一个旧活动页 /old-event/,业务上已经结束。先请求响应头:
curl -I https://example.com/old-event/
如果返回 HTTP/1.1 200 OK,继续取正文并检查是否只剩提示语:
curl -s https://example.com/old-event/ | grep -i "已结束\|不存在\|已下线"
若正文里只有这类提示,且没有产品参数、时间、地点、联系方式等实质信息,就可以判断为软 404。此时的动作是让服务器对这个 URL 返回 404 或 410,而不是继续返回 200。这个动作的结果会直接影响下一步:状态码改正后,再观察百度收录时间查询中该 URL 的变化,才有意义;如果状态码不改,只改正文,收录状态可能长期停留在旧结果上。
反过来,如果正文仍然完整,只是业务上不再更新,那么返回 200 是成立的。此时不需要为了“让它退出”而强行改成 404,因为那会丢掉仍然对用户有用的内容。更合适的动作是保留页面,并在内容里补充说明它已不再更新,或者把它指向仍然有效的新页面。
旧系统或旧合作关系下线时,往往不是整站消失,而是一批 URL 需要处理。此时不要按“全部改 404”一刀切,而要先分类。
分类之后,再对每一类分别核对状态码与正文是否一致。301 的正文通常很短,这是正常的;404 的正文可以保留站点导航,但不能保留原内容的完整副本,否则仍然构成软 404 的变体。
百度收录时间查询反映的是某个 URL 曾经被处理过的时间点,它不能证明当前响应正确,也不能证明内容仍然有效。一个 URL 显示已收录,同时服务器返回 200,但正文为空,这三者可以同时成立。反过来,一个 URL 显示未收录,也不代表它一定返回了错误状态。
因此,核对一致性时应该把收录时间查询当作线索,而不是结论。真正能区分软 404 和真内容页的证据是:同一时刻的响应状态码、正文中是否还有实质信息、以及这个 URL 在站点结构中是否还有入口。如果正文为空但站内仍有大量内链指向它,那么即使状态码改成 404,也需要同步清理内链,否则用户和爬虫仍会不断到达这个地址。
另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。用 robots.txt 屏蔽一个软 404 页面,只会阻止抓取,不会让已经存在的索引结果消失。要处理这类页面,状态码和正文的一致性仍然是第一位的。
面对“错误页面误返回成功响应”的情况,可以按下面顺序操作,每一步的结果都决定下一步。
这套顺序的关键在于:先让响应状态与页面内容一致,再去看收录结果。如果顺序反过来,只盯着收录时间查询的数字变化,很容易把“还没更新”误判为“处理无效”,从而做出多余的改动。