跳至主要內容
Skip to content

狀態碼寶典(上):1xx-3xx 資訊、成功與重導向 ​

HTTP 狀態碼是伺服器對請求的「回答」,它用三位數字告訴客戶端:請求成功了嗎?失敗了是誰的錯?需要做什麼額外處理?本篇將完整解析 1xx 到 3xx 的所有常見狀態碼。


一、 狀態碼總覽 ​

1.1 分類規則 ​

範圍類別含義
1xxInformational資訊性回應,請求已接收,繼續處理
2xxSuccess成功,請求已正確處理
3xxRedirection重導向,需要進一步操作
4xxClient Error客戶端錯誤(下一篇)
5xxServer Error伺服器錯誤(下一篇)

1.2 狀態碼結構 ​

HTTP/1.1 200 OK
         ^^^ ^^
         |   └─ 原因短語(Reason Phrase)
         └───── 狀態碼(Status Code)

NOTE

HTTP/2 和 HTTP/3 已移除原因短語,只保留狀態碼數字。


二、 1xx 資訊性回應 ​

1xx 狀態碼表示「伺服器已收到請求,正在處理中」。這類回應較少見,但在特定場景很重要。

100 Continue ​

含義:伺服器已收到請求標頭,客戶端可以繼續發送 Body

使用場景:上傳大型檔案時,先確認伺服器願意接收

101 Switching Protocols ​

含義:伺服器同意切換協定

使用場景:WebSocket 握手

http
# 請求
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade

# 回應
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

103 Early Hints ​

含義:在最終回應前,預先告知客戶端可以預載的資源

使用場景:優化頁面載入速度

http
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </script.js>; rel=preload; as=script

# 稍後...
HTTP/1.1 200 OK
Content-Type: text/html
...

TIP

103 Early Hints 是 HTTP/2 和 HTTP/3 的優化利器,可讓瀏覽器在伺服器處理期間就開始預載資源。


三、 2xx 成功回應 ​

2xx 狀態碼表示「請求已成功處理」。這是最常見的回應類別。

200 OK ​

含義:請求成功

使用場景:最常見的成功回應

http
# GET 請求
HTTP/1.1 200 OK
Content-Type: application/json

{"id": 1, "name": "John"}

# POST 請求(非創建資源的操作)
HTTP/1.1 200 OK
Content-Type: application/json

{"success": true, "message": "操作完成"}

201 Created ​

含義:資源已成功創建

使用場景:POST 請求創建新資源

http
POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "John", "email": "john@example.com"}

HTTP/1.1 201 Created
Location: /api/users/123
Content-Type: application/json

{"id": 123, "name": "John", "email": "john@example.com"}

重點:

  • 應包含 Location 標頭指向新資源
  • Body 中可包含創建的資源內容

202 Accepted ​

含義:請求已接受,但尚未處理完成

使用場景:異步處理、佇列任務

http
POST /api/reports/generate HTTP/1.1

HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /api/jobs/456

{
  "jobId": "456",
  "status": "pending",
  "checkStatusAt": "/api/jobs/456"
}

204 No Content ​

含義:請求成功,但沒有內容可返回

使用場景:DELETE 成功、PUT 更新成功(無需返回資料)

http
DELETE /api/users/123 HTTP/1.1

HTTP/1.1 204 No Content

注意:

  • 204 不應有 Body
  • 常用於「靜默成功」的操作

206 Partial Content ​

含義:返回資源的部分內容

使用場景:斷點續傳、視頻串流

http
# 請求
GET /video.mp4 HTTP/1.1
Range: bytes=0-1023

# 回應
HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/1048576
Content-Length: 1024

(前 1024 bytes 的內容)

Range 請求的工作原理:


四、 3xx 重導向 ​

3xx 狀態碼表示「需要進一步操作才能完成請求」。

3.1 重導向分類 ​

狀態碼永久/臨時方法改變可快取
301永久GET → GET✅
302臨時可能改變❌
303臨時任何 → GET❌
307臨時不改變❌
308永久不改變✅

301 Moved Permanently ​

含義:資源已永久移動到新位置

使用場景:網站遷移、URL 規範化

http
GET /old-page HTTP/1.1

HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/new-page

特點:

  • 瀏覽器會快取此重導向
  • 搜尋引擎會更新索引到新 URL
  • 原請求方法可能被改為 GET(歷史行為)

302 Found ​

含義:資源臨時位於其他位置

使用場景:臨時維護頁面

http
HTTP/1.1 302 Found
Location: /maintenance.html

WARNING

302 的歷史行為不一致:有些瀏覽器會將 POST 改為 GET。如果需要保持方法,請使用 307。

303 See Other ​

含義:應使用 GET 請求另一個 URL

使用場景:POST-Redirect-GET 模式

304 Not Modified ​

含義:資源未修改,可使用快取版本

使用場景:快取驗證

http
# 請求
GET /style.css HTTP/1.1
If-None-Match: "abc123"

# 回應
HTTP/1.1 304 Not Modified
ETag: "abc123"

特點:

  • 沒有 Body,節省頻寬
  • 搭配 If-None-Match 或 If-Modified-Since 使用

307 Temporary Redirect ​

含義:臨時重導向,保持原請求方法

使用場景:需要保持 POST 的臨時重導向

http
POST /api/process HTTP/1.1

HTTP/1.1 307 Temporary Redirect
Location: /api/process-v2

# 客戶端會向 /api/process-v2 發送相同的 POST 請求

308 Permanent Redirect ​

含義:永久重導向,保持原請求方法

使用場景:API 版本升級(保持 POST)

http
POST /api/v1/users HTTP/1.1

HTTP/1.1 308 Permanent Redirect
Location: /api/v2/users

五、 重導向最佳實踐 ​

5.1 選擇正確的狀態碼 ​

5.2 避免重導向鏈 ​

http
# ❌ 不好:多次重導向
/page → 301 → /page/ → 301 → https://www.example.com/page/

# ✅ 好:直接到最終目標
/page → 301 → https://www.example.com/page/

5.3 常見重導向場景 ​

場景建議狀態碼
HTTP → HTTPS301
www → non-www301
舊 URL → 新 URL301
登入後跳轉303
表單提交後303
A/B 測試302
維護頁面302 或 503
API 版本升級308

六、 實用速查表 ​

1xx 系列 ​

狀態碼名稱常見場景
100Continue大型上傳前確認
101Switching ProtocolsWebSocket 握手
103Early Hints預載資源提示

2xx 系列 ​

狀態碼名稱常見場景
200OK一般成功回應
201Created創建資源成功
202Accepted異步處理已接受
204No Content刪除成功、靜默更新
206Partial Content斷點續傳、Range 請求

3xx 系列 ​

狀態碼名稱常見場景
301Moved Permanently永久 URL 變更
302Found臨時重導向
303See OtherPOST 後跳轉
304Not Modified快取驗證
307Temporary Redirect保持方法的臨時跳轉
308Permanent Redirect保持方法的永久跳轉

總結 ​

類別含義客戶端行為
1xx處理中等待或繼續發送
2xx成功處理回應內容
3xx重導向跟隨 Location 標頭

> **記憶口訣**:

  • 1xx = 「等一下」
  • 2xx = 「沒問題」
  • 3xx = 「去別處」

進階挑戰 ​

  1. 使用 cURL 的 -I 和 -L 參數,追蹤 http://google.com 的完整重導向鏈。
  2. 設計一個支援斷點續傳的檔案下載 API,寫出請求和回應的完整 Headers。
  3. 思考:為什麼 304 Not Modified 不應該有 Body?如果回傳 Body 會發生什麼?

延伸閱讀與資源 ​