從你收到的那個代碼開始查。每一頁都把「規格說了什麼」和「你實際上要做什麼」分開寫,而且前端、後端、還有只是想把網頁打開的人,會被當成三個不同的問題來回答。
| 代碼 | 名稱 | 類別 | 代表什麼 |
|---|---|---|---|
| 301 | Moved Permanently | 3xx | 舊網址退休了,接手的是 `Location` 裡的那一個——而 301 是少數幾種伺服器沒交代、快取也可以自己存起來的回應,所以送錯的 301 是最難收回來的一種轉址。 |
| 302 | Found | 3xx | 一次暫時的繞路:資源還是屬於你要的那個網址,只是現在伺服器想從別的地方把它送出來——而你的瀏覽器會直接繞過去,完全不會讓你的程式碼看到這一跳。 |
| 304 | Not Modified | 3xx | 你手上那份還是好的:你在請求裡帶了驗證器,伺服器拿去跟自己那份比對,一樣,於是它刻意只回標頭、不回內容。 |
| 400 | Bad Request | 4xx | 伺服器根本不願意去解讀這個請求——請求行、某個標頭、訊息框架或 body 裡有東西格式錯了或太大——通常這代表你的應用程式碼一行都沒跑到。 |
| 401 | Unauthorized | 4xx | 這個請求沒有帶上可用的認證憑證——原因片語寫的是 Unauthorized,但它描述的狀況其實是「沒認證」,而且伺服器有義務用一個標頭告訴你什麼樣的憑證才行。 |
| 403 | Forbidden | 4xx | 伺服器完全看懂了這個請求,而且拒絕執行它——跟 401 不一樣的是,它沒有義務給你任何一個標頭去說明怎樣才行得通。 |
| 404 | Not Found | 4xx | 伺服器看懂了你的請求,只是那條路徑上沒有東西可以給你。在現在的架構裡,這比較常是路由或部署漏掉了一步,而不是誰貼了一條死連結。 |
| 405 | Method Not Allowed | 4xx | 路徑在,方法伺服器也認得——它只是不接受你在這裡用這個方法,而且它有義務把它願意收的方法清單交給你。 |
| 429 | Too Many Requests | 4xx | 某個限流器認定你問得太頻繁了——這是一句政策上的宣告,不是協定上的,所以兩個都回 429 的服務,數的可能是完全不同的東西。 |
| 500 | Internal Server Error | 5xx | 應用程式自己跑起來了,撞到一個它沒預期的東西,然後放棄——所以跟 502、504 不一樣,某個地方一定有一份 stack trace,而整件事的工作就是找出它在哪一份紀錄裡。 |
| 502 | Bad Gateway | 5xx | 應用程式前面那台代理替它回了話,因為應用程式自己的回應沒來、中途斷掉,或根本不是合法的 HTTP。 |
| 503 | Service Unavailable | 5xx | 有某個東西決定現在不服務你,而且是刻意的——維護頁、限流器,或者一台手上沒有任何健康後端可以轉的負載平衡器——這讓 503 成為唯一附帶到期日的 5xx。 |
| 504 | Gateway Timeout | 5xx | 代理等某台 upstream 等到沒耐心了,於是替它回話——所以真正指認兇手的不是狀態碼,而是耗掉的時間,那永遠是某個人設定的逾時。 |
| 521 | Web Server Is Down非標準 | 5xx | Cloudflare 自己的代碼、不是 IETF 的,指的是整個 5xx 範圍裡最窄的一種失敗:你的來源機主動拒絕了 Cloudflare 的 TCP 連線,所以沒有東西慢、也沒有東西送錯地方——是有東西說了不。 |
| 524 | A Timeout Occurred非標準 | 5xx | Cloudflare 自己的代碼,用在一個一路進得去、然後就沒聲音的請求上:連線成功了、來源機收到了,而 125 秒之後還是沒有任何 HTTP 回應可以送回來。 |