先分清软 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 的清理通常不是一個動作,而是一轮一轮收窄的。