搞懂 HTTP 狀態碼:網頁新手必讀的除錯密技

Published November 14, 2024 by 徐培鈞
基礎概念

你有沒有在瀏覽網頁時看過「404」或「500 錯誤」?這些數字到底是什麼意思?

簡單來說,狀態碼就是伺服器給你的「回覆訊息」。就像你傳訊息給朋友,朋友會回「收到」、「我不在」或「你傳錯人了」一樣,伺服器也會用這些數字告訴你:請求成功了、失敗了、還是要你去別的地方找。

這篇文章會用最白話的方式,帶你認識這些常見的狀態碼,讓你以後看到錯誤訊息不再一頭霧水!

狀態碼長怎樣?先看開頭數字就對了

狀態碼都是三位數,而且只要看「第一個數字」,你就能大概知道發生什麼事:

代表意思處理中
白話翻譯「等一下喔,我還在忙」
代表意思成功
白話翻譯「OK,搞定了!」
代表意思轉址
白話翻譯「你要找的東西搬家了,去這裡找」
代表意思你的問題
白話翻譯「你搞錯了,不是我的錯喔」
代表意思伺服器的問題
白話翻譯「抱歉,是我這邊出包了」

接下來我們一個一個來看!

1xx 系列:處理中(很少見)

這系列你幾乎不會遇到,就是伺服器跟你說「收到了,正在處理」。

跳過,不用太在意。

2xx 系列:成功!沒問題!

這是最開心的狀態碼,代表一切順利。

200 OK

最常見的成功碼。意思就是:「你要的東西,我給你了。」

你每次正常開啟網頁,背後都是回傳 200。

201 Created(已建立)

新增資料成功!通常在你「新增」東西的時候會收到這個。

比喻:你去戶政事務所辦新的身分證,櫃台跟你說「好了,幫你建檔完成,這是你的新證件。」

常見情境

  • 註冊新帳號成功
  • 發表一篇新文章
  • 新增一筆訂單

跟 200 的差別是:200 是「我給你資料」,201 是「我幫你新建了一筆資料」。

204 No Content(成功,但沒東西給你)

操作成功了,但伺服器沒有東西要回傳給你。

比喻:你請同事幫你刪掉某個檔案,同事說「刪好了」,然後就沒有然後了——因為東西都刪掉了,沒什麼好給你看的。

常見情境

  • 刪除資料成功(DELETE 請求)
  • 更新資料成功,但不需要回傳內容
  • 按了「儲存」,後端存好了但不用回傳東西

重點是:沒有回傳內容不代表失敗,204 就是在說「搞定了,但我沒東西要給你」。

3xx 系列:轉址(東西搬家了)

這系列的意思是:「你要找的東西不在這裡,但我告訴你去哪裡找。」

301 vs 302:永久搬家 vs 暫時不在

這兩個超級常見,一定要搞懂差別!

301:永久轉址(搬家了,不會回來)

情境比喻

你去大樓找小明,警衛跟你說:

「小明已經從 4 樓搬到 6 樓了,以後都去 6 樓找他。」

這就是 301。小明永久搬家了,以後你都應該直接去 6 樓。

實際應用

  • 網站換網址了(例如從 old-site.com 換到 new-site.com
  • 對 SEO 很重要,搜尋引擎會記住新地址

302:暫時轉址(只是暫時不在)

情境比喻

你去大樓找小明,警衛跟你說:

「小明現在在 301 會議室開會,你可以去那邊找他,但開完會他會回辦公室。」

這就是 302。小明只是暫時不在位置上,之後還是會回來。

實際應用

  • 網站維護中,暫時導到別的頁面
  • 促銷活動期間,暫時轉到活動頁

一句話記住差別

一句話「我搬家了,以後來新地址找我」
一句話「我暫時不在,等等就回來」

4xx 系列:你搞錯了(用戶端錯誤)

這系列代表問題出在「你」這邊,不是伺服器的錯。

400 Bad Request(請求格式錯誤)

你送出的請求伺服器看不懂。

比喻:你去麥當勞說「我要一份藍色的漢堡」,店員會說「蛤?你在說什麼?」

401 Unauthorized(沒有登入)

你沒有通過身份驗證,伺服器不知道你是誰。

比喻:你想進公司大樓,但沒帶員工證,警衛說「請先出示證件,我不知道你是誰」。

403 Forbidden(禁止存取)

你有登入,但你沒有權限看這個東西。

比喻:你刷了員工證進公司,但你想進機房,門禁系統說「你不是 IT 部門的,不能進」。

404 Not Found(找不到)

最有名的錯誤碼!代表你要的頁面不存在。

比喻:你去圖書館找一本書,圖書館員說「我們沒有這本書」。

常見原因

  • 網址打錯了
  • 頁面被刪除了
  • 連結過期了

5xx 系列:伺服器出包了

這系列代表問題出在伺服器那邊,不是你的錯。遇到這種情況,通常只能等網站修好。

500 Internal Server Error(內部錯誤)

伺服器內部發生不明錯誤,沒辦法處理你的請求。

比喻:你去餐廳點餐,廚房突然失火了,店員跑出來說「抱歉,我們內部出了點問題」。

常見原因

  • 程式碼有 bug
  • 資料庫連線出問題
  • 伺服器設定錯誤

這是工程師最怕看到的錯誤碼,因為原因可能很多,需要去看 log 才知道。

502 Bad Gateway(閘道錯誤)

伺服器之間的溝通出問題了。

這是什麼意思? 現代網站通常不是只有一台伺服器,而是有很多層,例如:

你的瀏覽器 → 反向代理(Nginx)→ 應用伺服器(你的網站程式)

502 代表「反向代理」連不到後面的「應用伺服器」。

比喻:你打電話給公司總機,總機說「抱歉,我轉接不到那個分機,線路好像斷了」。

常見原因

  • 應用伺服器掛掉了
  • 反向代理設定錯誤
  • DNS 解析出問題,找不到後端伺服器

504 Gateway Timeout(閘道逾時)

反向代理等後端伺服器等太久,等到放棄了。

比喻:你打電話給公司總機,總機幫你轉接,但那邊一直沒人接,等了 30 秒後總機說「抱歉,對方沒有回應」。

常見原因

  • 後端伺服器太忙,來不及回應
  • 某個程式執行太久(例如查詢很大的資料庫)
  • 網路連線不穩定

502 vs 504 的差別

白話說明「連線斷掉了,根本連不上」
白話說明「有連上,但對方太久沒回應,我放棄了」

彩蛋:418 I’m a teapot(我是茶壺)

這是一個真實存在但超搞笑的狀態碼!

由來

1998 年愚人節,有人開玩笑提出一個「超文本咖啡壺控制協議」(HTCPCP),裡面規定:如果你叫一個茶壺幫你泡咖啡,它應該回傳 418,意思是「我是茶壺,我不會泡咖啡」。

實際用途

沒有。這純粹是工程師的幽默。但它已經被寫進正式文件,成為網路文化的一部分。

有些網站會特別做一個 418 頁面,當作彩蛋讓人發現。

常見狀態碼速查表

名稱OK
白話翻譯成功,一切正常
名稱Created
白話翻譯新增成功,幫你建好了
名稱No Content
白話翻譯成功,但沒東西給你
名稱Moved Permanently
白話翻譯永久搬家了
名稱Found
白話翻譯暫時不在這裡
名稱Bad Request
白話翻譯你的請求我看不懂
名稱Unauthorized
白話翻譯請先登入
名稱Forbidden
白話翻譯你沒有權限
名稱Not Found
白話翻譯找不到這個頁面
名稱Internal Server Error
白話翻譯伺服器內部爆炸了
名稱Bad Gateway
白話翻譯伺服器之間連線斷了
名稱Gateway Timeout
白話翻譯伺服器回應太慢,逾時了
名稱I’m a teapot
白話翻譯我是茶壺(搞笑用)

總結

學會看狀態碼,除錯會變得更有效率:

  1. 看到 4xx:先檢查自己的請求對不對(網址、參數、權限)
  2. 看到 5xx:問題在伺服器,去看 log 或等網站修復
  3. 看到 3xx:資源搬家了,跟著轉址走就好
  4. 看到 2xx:恭喜,一切順利!

下次再看到錯誤頁面,你就知道發生什麼事了!

延伸學習

想要查詢更多狀態碼,可以參考: