Skip to content

301、302、404、410:HTTP 狀態碼怎麼影響 SEO

HTTP 狀態碼與 SEO:301、302、404、410

狀態碼是伺服器對爬蟲說的 第一句話,在任何標記被讀取之前就已經決定了這個網址的命運。它負責 索引流程 的第二關。

各狀態碼對索引的意義

狀態碼意義對索引的影響
200成功正常評估是否收錄
204無內容回應沒有內容,可能被判定為軟性 404
301永久搬遷舊網址移出索引,訊號轉給新網址
302臨時搬遷保留舊網址 在索引中
304未修改沿用先前抓到的內容
401未授權同 403,一段時間後移出索引
403禁止存取一段時間後移出索引
404找不到多次確認後移出索引
410永久移除比 404 更快 移出索引
429請求過多爬蟲降低抓取頻率
5xx伺服器錯誤暫時保留,長期持續則移出

301 還是 302

判斷標準只有一句話

舊網址將來還會不會回來?

  • 不會 → 301(永久)
  • 會 → 302(臨時)
情境用哪個
改版換了路徑結構301
網域搬遷301
httphttps301
統一 www 與非 www301
統一尾斜線301
活動期間暫時導到專頁302
維護期間導到公告頁302
依語言或地區自動導向302

用錯的後果很具體:

錯誤後果
永久搬遷卻用 302舊網址一直留在索引裡,與新網址互相競爭
臨時導向卻用 301舊網址被移出索引,活動結束後要重新累積

404 還是 410

404410
意義找不到(可能是暫時的)已永久移除
移出索引的速度較慢,需多次確認較快
適合不確定、可能復原確定永久下架

確定不會回來就用 410

下架的商品、結束的活動、刪除的文章,如果確定不會再上線,回傳 410 能讓它更快從搜尋結果消失。

不確定的話用 404 也完全沒問題,兩者最終結果相同,只是速度差異。

軟性 404

這是最常見的隱形問題

頁面顯示「找不到內容」,但伺服器回傳 200。

搜尋引擎會偵測到這種矛盾,把它標記為軟性 404(Soft 404)並拒絕收錄。麻煩的是它 不會出現在任何錯誤紀錄裡,對使用者和監控系統來說,這是一次成功的請求。

三個常見成因:

前端路由處理不存在的頁面

js
// 找不到對應路由時顯示 404 元件,但 HTTP 狀態碼仍是 200
{
  path: '/:pathMatch(.*)*',
  component: NotFoundPage,
}

用戶端渲染 的專案幾乎必然有這個問題,因為狀態碼在伺服器就已經決定了。解法是讓伺服器對不存在的路徑真的回傳 404,或改用能控制狀態碼的 伺服器端渲染

把找不到的網址導到首頁

nginx
# 不要這樣做
error_page 404 = @redirect_home;

導到首頁比 404 更糟

使用者以為連結有效,點進去卻看到不相關的內容,這是糟糕的體驗。搜尋引擎也會判定為軟性 404。

回傳真正的 404 才是對的,然後在頁面上提供搜尋框與相關連結協助使用者。

空的列表頁

商品分類下沒有任何商品、搜尋結果為零筆,卻回傳 200 加上一個空頁面。這類頁面應該考慮 noindex

回傳 204(無內容)也一樣,爬蟲拿不到任何可評估的內容,同樣會被歸為軟性 404。

轉址鏈與轉址迴圈

轉址鏈會累積延遲

/old-page  →  301  →  /temp-page  →  301  →  /new-page

每一跳都是一次額外的往返。過長的鏈甚至可能讓爬蟲中途放棄,也直接拖慢使用者的 載入速度

改版時應該把所有舊網址直接指向最終目標,不要讓它們串起來。

轉址迴圈更嚴重,/a → /b → /a 會讓頁面完全打不開。常見成因是兩條轉址規則互相衝突,例如:「加尾斜線」與「去尾斜線」同時存在。

改版搬遷的轉址對照表

網站改版是最容易掉流量的時刻。做法:

1. 匯出舊網址清單

從三個來源蒐集,取聯集:

來源拿到什麼
舊站的 sitemap您認為存在的網址
Search Console 的涵蓋範圍實際被收錄 的網址
分析工具的到達網頁報告實際有流量 的網址

Search Console 的清單最重要

sitemap 是「您以為的」,Search Console 是「搜尋引擎實際收錄的」。兩者常有落差,而落差的那些網址往往正是有排名的舊頁面。

2. 建立對照表

舊網址                          新網址
/products/detail.php?id=123  →  /products/wireless-mouse
/blog/2024/01/post-title     →  /blog/post-title
/about-us.html               →  /about

一對一對應不到的處理原則:

情況怎麼做
有相似內容的新頁面301 到那一頁
內容已合併到別頁301 到合併後的頁面
內容永久移除410,不要硬轉到不相關的頁面
整個分類消失301 到上一層分類,不要全部導首頁

3. 上線後驗證

bash
# 逐一確認舊網址回傳 301 且 Location 正確
curl -sI https://example.com/about-us.html | grep -E 'HTTP|location'

把這件事寫成腳本跑一遍整份對照表,比人工點連結可靠得多,放進持續整合流程,就不會有「這次忘了跑」的問題。

4. 轉址要留多久

搜尋引擎需要時間把訊號完全轉移,外部連結與使用者的書籤更是長期存在。至少保留一年,流量大的站建議永久保留。

5xx 的特殊之處

伺服器錯誤和其他狀態碼不同,它不代表「這一頁不該存在」,而是「現在問不到」。

持續時間搜尋引擎的反應
短暫稍後重試,索引不變
持續數天降低抓取頻率
長期把網址移出索引

robots.txt 回傳 5xx 最危險

robots.txt 回傳伺服器錯誤時,部分爬蟲會保守地假設「規則不明,先不要抓」而 暫停抓取整個網站

這個檔案的可用性比它的內容更重要。

檢查清單

項目標準
正常頁面回傳 200必備
不存在的頁面回傳真正的 404必備
沒有把 404 導到首頁必備
永久搬遷用 301 而非 302必備
沒有轉址鏈(一跳到底)必備
沒有轉址迴圈必備
確定下架的內容回傳 410建議
sitemap 內沒有非 200 的網址必備
改版有完整的轉址對照表必備
轉址至少保留一年建議

常見問題

301 和 302 該用哪一個?

永久搬遷用 301,臨時導向用 302。判斷標準是舊網址將來還會不會回來:改版換路徑、網域搬遷用 301;活動期間暫時導到專頁、維護期間導到公告頁用 302。用錯的後果是舊網址該被移除卻一直留著,或是該保留卻被移除。

404 和 410 有什麼差別?

404 表示找不到,可能只是暫時的;410 表示內容已永久移除。搜尋引擎對 410 的處理較果斷,通常比 404 更快把網址移出索引。確定永久下架就回傳 410,不確定或可能復原就用 404。

什麼是軟性 404?

頁面顯示找不到內容,但伺服器卻回傳 200 的情況。搜尋引擎會偵測到這種矛盾並標記為軟性 404。常見成因是用 前端路由 處理不存在的頁面,或把找不到的網址直接導到首頁。

轉址會損失權重嗎?

單次的 301 轉址幾乎不會損失。真正的問題是轉址鏈:舊網址轉到中繼網址再轉到最終網址,每一跳都增加延遲,過長的鏈甚至可能讓爬蟲中途放棄。改版時應該把所有舊網址直接指向最終目標。

找不到的頁面可以全部導到首頁嗎?

不要這樣做。使用者以為連結有效卻看到不相關的內容,搜尋引擎也會把它判定為軟性 404。正確做法是回傳真正的 404 狀態碼,並在頁面上提供搜尋框與相關連結協助使用者。

延伸閱讀

參考資料:Google 搜尋中心:Google 如何處理 HTTP 狀態碼