301、302、404、410:HTTP 狀態碼怎麼影響 SEO
狀態碼是伺服器對爬蟲說的 第一句話,在任何標記被讀取之前就已經決定了這個網址的命運。它負責 索引流程 的第二關。
各狀態碼對索引的意義
| 狀態碼 | 意義 | 對索引的影響 |
|---|---|---|
| 200 | 成功 | 正常評估是否收錄 |
| 204 | 無內容 | 回應沒有內容,可能被判定為軟性 404 |
| 301 | 永久搬遷 | 舊網址移出索引,訊號轉給新網址 |
| 302 | 臨時搬遷 | 保留舊網址 在索引中 |
| 304 | 未修改 | 沿用先前抓到的內容 |
| 401 | 未授權 | 同 403,一段時間後移出索引 |
| 403 | 禁止存取 | 一段時間後移出索引 |
| 404 | 找不到 | 多次確認後移出索引 |
| 410 | 永久移除 | 比 404 更快 移出索引 |
| 429 | 請求過多 | 爬蟲降低抓取頻率 |
| 5xx | 伺服器錯誤 | 暫時保留,長期持續則移出 |
301 還是 302
判斷標準只有一句話
舊網址將來還會不會回來?
- 不會 → 301(永久)
- 會 → 302(臨時)
| 情境 | 用哪個 |
|---|---|
| 改版換了路徑結構 | 301 |
| 網域搬遷 | 301 |
http 轉 https | 301 |
| 統一 www 與非 www | 301 |
| 統一尾斜線 | 301 |
| 活動期間暫時導到專頁 | 302 |
| 維護期間導到公告頁 | 302 |
| 依語言或地區自動導向 | 302 |
用錯的後果很具體:
| 錯誤 | 後果 |
|---|---|
| 永久搬遷卻用 302 | 舊網址一直留在索引裡,與新網址互相競爭 |
| 臨時導向卻用 301 | 舊網址被移出索引,活動結束後要重新累積 |
404 還是 410
| 404 | 410 | |
|---|---|---|
| 意義 | 找不到(可能是暫時的) | 已永久移除 |
| 移出索引的速度 | 較慢,需多次確認 | 較快 |
| 適合 | 不確定、可能復原 | 確定永久下架 |
確定不會回來就用 410
下架的商品、結束的活動、刪除的文章,如果確定不會再上線,回傳 410 能讓它更快從搜尋結果消失。
不確定的話用 404 也完全沒問題,兩者最終結果相同,只是速度差異。
軟性 404
這是最常見的隱形問題
頁面顯示「找不到內容」,但伺服器回傳 200。
搜尋引擎會偵測到這種矛盾,把它標記為軟性 404(Soft 404)並拒絕收錄。麻煩的是它 不會出現在任何錯誤紀錄裡,對使用者和監控系統來說,這是一次成功的請求。
三個常見成因:
前端路由處理不存在的頁面
// 找不到對應路由時顯示 404 元件,但 HTTP 狀態碼仍是 200
{
path: '/:pathMatch(.*)*',
component: NotFoundPage,
}純 用戶端渲染 的專案幾乎必然有這個問題,因為狀態碼在伺服器就已經決定了。解法是讓伺服器對不存在的路徑真的回傳 404,或改用能控制狀態碼的 伺服器端渲染 。
把找不到的網址導到首頁
# 不要這樣做
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. 上線後驗證
# 逐一確認舊網址回傳 301 且 Location 正確
curl -sI https://example.com/about-us.html | grep -E 'HTTP|location'把這件事寫成腳本跑一遍整份對照表,比人工點連結可靠得多,放進持續整合流程,就不會有「這次忘了跑」的問題。
4. 轉址要留多久
搜尋引擎需要時間把訊號完全轉移,外部連結與使用者的書籤更是長期存在。至少保留一年,流量大的站建議永久保留。
5xx 的特殊之處
伺服器錯誤和其他狀態碼不同,它不代表「這一頁不該存在」,而是「現在問不到」。
| 持續時間 | 搜尋引擎的反應 |
|---|---|
| 短暫 | 稍後重試,索引不變 |
| 持續數天 | 降低抓取頻率 |
| 長期 | 把網址移出索引 |
檢查清單
| 項目 | 標準 |
|---|---|
| 正常頁面回傳 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 狀態碼,並在頁面上提供搜尋框與相關連結協助使用者。