服務器返回的狀態碼,是抓取工具和浏览器判断一個地址“是什么情况”的第一手依據。頁面内容再正常,只要狀態碼给错了,後續的抓取、缓存、展示都會按错誤的假设走。這項自查不需要改模板,只要在几個關键位置確認响應头是否符合實际语义。
狀態碼為什么會直接影响抓取判断
抓取工具拿到 200,會認為這是一個可索引的正常頁面;拿到 404 或 410,會逐渐把地址從队列里清掉;拿到 301 或 302,會把後續請求轉到新地址;连續拿到 5xx,則可能降低對整站的抓取频率。狀態碼是机器讀到的第一句话,内容只是第二句话。
問题在于,很多站点是在頁面层面處理错誤,而不是在响應头层面。模板渲染出一個“找不到内容”的頁面,狀態碼却仍然是 200,机器讀到的就是“這里有一篇正常内容”。
三個最常见的错配
软 404:返回 200 的空内容頁
這是最普遍的一種。文章被刪除、商品下架、參數拼错,程序没有走到 404 分支,只是列表為空、正文為空,頁面照样以 200 輸出。對訪客来说体驗尚可,對抓取来说却多了一個内容重复或近乎空白的地址,長期积累會稀释有效頁面分到的抓取份額。
排查方式很简單:随机抽几十個已刪除或參數错誤的地址,用命令行查看响應头,而不是只看頁面長什么样。
该 404 的頁面被重定向到首頁
把失效地址一律 302 到首頁,看起来“没有死鏈”,實际上是把所有错誤信号揉成一团。大量不同的失效地址最终指向同一個首頁,抓取工具會把它当成软 404 的一種形式,首頁也會因此收到一堆無意义的請求。
5xx 当成常態
接口超时、資料库连接失敗、模板报错时返回 500,本身没错。但如果某個栏目長期有較高比例的請求返回 5xx,抓取频率會被主動調低,恢复之後想再提上来需要時間。所以 5xx 是要被监控的異常,而不是可以長期存在的狀態。
一轮可执行的自查清單
- 准备一份地址样本:正常内容頁、已刪除頁、參數错誤頁、權限受限頁、搜尋無结果頁,各取几個。
- 用 curl -I 或浏览器開發者工具的網絡面板,只看狀態碼和 Location,不看渲染结果。
- 確認已刪除内容返回 404 或 410;有语义相同替代内容的,用 301 指向新地址,而不是 302。
- 確認登入頁、後台、接口類地址不會返回 200 的完整内容頁。
- 检查 301 鏈是否只有一跳,避免 A 到 B 再到 C 的连續跳轉。
- 確認不存在整站范围的 5xx 或大量超时,並把阈值寫進监控告警。
- 把修改過的狀態碼记錄下来,改版後重新跑一遍同样的样本。
顺手要看的几處细节
- 搜尋頁無结果:返回 404 還是 200 空頁,需要按實际设計统一,不要让每個關鍵詞组合都产生一個 200 頁面。
- 大小寫與结尾斜杠:统一規范後,另一種寫法應 301 到規范地址,而不是各自返回 200。
- 分頁越界:訪問超出范围的分頁參數,應返回 404,而不是直接顯示最後一頁。
- 维護頁:短期维護用 503 並带上 Retry-After,比返回 200 的“正在维護”頁面更准确。
從日誌里確認,而不是凭感觉
服務器日誌记錄了每個請求的狀態碼,按路径分组統計一下,比例異常的目錄通常就是問题所在。重点看三類:某個栏目 404 占比突然升高、某個前缀大量出現 302、以及 5xx 集中在某個時間段。抓取日誌同样值得對照,看蜘蛛拿到的狀態碼分布是否和你的预期一致。
狀態碼是站点對外的第一句回答。回答得准确,後面的内容與结构優化才有意义;回答错了,再好的内容也會被当成異常地址来處理。