站点跑久了,多多少少會出現打不開的地址:文章下线了、栏目合並了、外部連結寫错了。這些地址對應的頁面往往没人管,但訪客和搜尋蜘蛛都會撞上。错誤頁做得好不好,直接影响两件事:訪客是繼續逛還是直接關掉,蜘蛛是把抓取预算浪費在死路上還是尽快轉向別處。
先把几種打不開的情况分清楚
很多人把所有打不開的情况统称為 404,實际上服務器返回的狀態碼含义差別很大,用错了會誤導訪客,也會誤導搜尋引擎。
- 404:地址對應的资源不存在。适合内容已删、但不确定以後是否恢复的情况。
- 410:资源被永久刪除,不會再回来。相比 404,它表達得更明确,蜘蛛處理起来也更干脆。
- 301 / 302:地址變了,属于跳轉而不是错誤。只在确實有新地址时使用。
- 403:资源存在但没有訪問權限。用 404 伪装權限不足是另一種做法,但別把两者混着用。
- 500 / 502 / 503:服務端出了問题。503 可以配合 Retry-After 告诉蜘蛛稍後再来。
狀態碼用错,麻烦在哪
最常见的两個坑是软 404 和兜底跳首頁。
软 404 指頁面實际返回 200,但内容寫的是内容不存在。訪客看不出来,蜘蛛却會把它当成正常頁面收下一份空壳。數量多了,站点里就积压一批没有價值的頁面。
兜底跳首頁則是把所有错誤地址都 301 到首頁。短期看訪客没有停在错誤頁,但预期落空,蜘蛛也可能把大量不相關的地址当成同一個頁面来處理。错誤的地址並没有真的變正确,只是被盖住了。
判断标准其實很简單:地址真的換了,用 301;内容真的没了,用 404 或 410;服務挂了,用 5xx。別把 301 当萬金油。
404 頁面本身该放什么
狀態碼對了,頁面内容也別是一片空白。一個能用的 404 頁至少包含几样東西。
- 一句清楚的說明,告诉訪客這個地址没有内容,而不是只寫系統错誤。
- 返回首頁和主要栏目的連結,最好带上一級栏目列表。
- 站内搜尋入口。訪客愿意留下来自己找,就還有机會。
- 和全站一致的導航與頁脚,別让错誤頁變成孤岛。
- 移動端可讀,不要做成只有一行小字加一張大图的展示頁。
另外,別让 404 頁面自動跳轉。跳轉會让訪客来不及看清楚發生了什么,也會让狀態碼的意义變得混乱。
顺手排查几個细节
URL 大小寫不一致、结尾斜杠时有时無,也會制造一批本不该存在的 404。Linux 服務器上 /About 和 /about 是两個地址,站内連結如果寫法不统一,蜘蛛就會顺着两種寫法各抓一遍。
服務器日誌里的 404 记錄其實是很好的參考。如果某個舊地址持續被訪問,說明還有外部連結或用戶书簽指向它,值得考虑做一次 301 到新地址,而不是放任它一直 404。
一次完整的自查怎么做
- 随便敲一個明顯不存在的地址,用浏览器開發者工具或 curl 看返回的狀態碼是不是 404。
- 找一個已下线内容的地址,確認它没有返回 200。
- 把站内几個主要入口頁面的連結点一遍,看看有没有拼寫或大小寫導致的死鏈。
- 翻一下最近的服務器日誌,把 404 出現次數靠前的地址列出来,逐個判断该重定向還是保持 404。
- 確認服務端错誤返回的是 5xx 而不是 200,避免故障被伪装成正常頁面。
- 在手机上打開一個 404 頁面,检查導航和搜尋框能不能正常使用。
這些事情一次做完大概一小时,之後每季度過一遍就够。错誤頁處理得好不會带来額外流量,但能少丢一点本来就不多的訪客,也能让蜘蛛少在死路上绕圈。