在抓取這件事上,狀態碼是最直接的一层沟通。蜘蛛請求一個 URL,服務器回 200,它預設這里有一份可用的内容;回 404 或 410,它就知道這個地址不用再来了。麻烦出在两者之間:地址已经没有什么可看的,服務器却依然回 200。這類頁面通常被称為软 404。
软 404 是怎么出現的
多數软 404 並不是有人刻意做出来的,而是模板和參數体系自然产生的副产品。常见的有這么几類:
- 篩選、排序、多條件组合之後没有任何结果,列表模板照常輸出,只是中間是空的。
- 商品下架、文章刪除後,詳情頁用兜底模板返回 200,正文位置寫着“内容不存在”。
- 分頁參數超出實际頁數,比如 ?page=999 仍然返回一個空列表。
- 站内搜尋结果頁,没有任何關鍵詞命中时同样返回 200。
- 空分類、空标簽、只建了壳還没填内容的栏目頁。
蜘蛛拿到 200 之後會做什么
蜘蛛並不理解頁面上的文案含义,它主要依赖狀態碼、可解析的連結结构、以及頁面之間的引用關系来判断一個地址值不值得保留。返回 200,等于告诉它“這里正常”。于是這個 URL 可能被收進索引,也可能在之後的抓取周期里被反复訪問。
問题在于,抓取资源是有限的。如果站点里存在大量這類空壳地址,蜘蛛每次来都要在這些頁面上花掉一部分時間,真正有内容的頁面分到的份額自然會被挤压。
影响不只是浪費抓取
软 404 的代價大致有三层。第一层是抓取层面的消耗,前面已经提到。第二层是内容层面的干扰:大量结构相同、内容為空的頁面混在索引里,會让站点整体呈現出一種“低信息密度”的狀態。第三层是维護层面的,時間一長,你很难分清哪些地址是真的不存在,哪些只是暂时没有内容。
先找出来,再决定怎么處理
排查可以從几個角度同时看:
- 從服務器日誌里筛出返回 200 的 URL,按路径模式归類,看哪些前缀下存在大量相似地址。
- 對同一模板的頁面做抽样,比較正文区域的文字量,異常偏低的那一批往往就是软 404。
- 把站内搜尋、篩選、排序這些參數單獨列出来,观察它們产生的 URL 有多少被蜘蛛訪問過。
- 结合搜尋後台的覆盖面报告,看是否存在大量“已抓取但未收錄”或“已發現但未抓取”的地址。
按類型分開處理,比一刀切更稳
确實已经不存在的
下架商品、刪除的文章,如果没有替代頁面,直接返回 404 或 410 是清晰的表達。410 语义更明确,表示永久移除,但實际使用中 404 已经够用。關键是不要让兜底模板繼續返回 200。
暂时没有内容的栏目
如果栏目未来會有内容,短期内可以保留頁面並加 noindex,避免它進入索引;等内容填充完再放開。如果長期没有补充計划,不必留着,直接 404 反而干净。
參數组合生成的空结果頁
這類頁面往往數量無限,靠逐個處理不現實。可行的方向是收敛參數:能合並的合並,能屏蔽的屏蔽,让蜘蛛只能訪問到有意义的參數组合。此时再把剩余的空结果頁统一返回 404。
站内搜尋和篩選结果頁
這類頁面本身對用戶有用,但不适合大量進入索引。常见做法是通過 robots.txt 或 noindex 控制,同时保證内部連結不要把蜘蛛引向随意拼接的搜尋參數。
几個容易踩的坑
- 用 200 加 noindex 長期兜底。它能阻止收錄,但抓取仍會發生,空頁面還會被繼續訪問。
- 為了清掉软 404,把一批本来正常的頁面也一並改成 404,反而制造了新的断鏈。
- 同时给软 404 頁面設定 canonical,指向一個並不相關的地址,信号會變得混乱。
- 只處理詳情頁,忘了列表頁、分頁和參數頁同样是软 404 的高發区。
判断标准可以很简單:如果這個地址對用戶来说已经没有可看的内容,它就不该以 200 的形式出現在抓取视野里。
把口径固定下来
软 404 不是一次清理就能解决的問题,它會随着商品上下架、内容更新不断重新出現。更實际的做法是在模板和路由层面定下規則:什么情况下返回 404,什么情况下保留頁面但加 noindex,什么情况下直接收敛參數。規則稳定之後,蜘蛛看到的地址集合會逐渐清晰,抓取资源也能更集中地落在真正有内容的頁面上。