2018年11月20日 星期二

《面試官別再問》HTTP狀態碼有哪些?區別?


深入解析 HTTP 狀態碼:協定溝通的語言

HTTP 狀態碼(HTTP Status Codes)是網路世界中,客戶端(通常是瀏覽器或應用程式)與伺服器之間溝通的關鍵訊息。每一次 HTTP 請求的往返,伺服器都會回傳一個三位數的數字狀態碼,用以告知客戶端該請求的處理結果。這些狀態碼不僅是單純的回應,更是診斷網路問題、優化應用程式效能以及確保網站安全的重要依據。

狀態碼的第一位數字定義了回應的類別,從而提供對請求結果的初步判斷。以下將詳細闡述 HTTP 狀態碼的五大類別及其核心區別。


1xx 資訊回應 (Informational Responses)

  • 意義:表示伺服器已收到請求的初始部分,並正在繼續處理。這些回應通常是臨時性的,旨在指示客戶端應繼續發送請求的其餘部分,或作為一種進度指示。它們通常不會攜帶實際的響應主體。

  • 常見範例

    • 100 Continue:伺服器已收到請求的頭部,並且客戶端應該繼續發送請求的其餘部分。

    • 101 Switching Protocols:伺服器同意客戶端的請求,將協定從一個版本升級到另一個版本(例如從 HTTP/1.1 升級到 WebSocket)。

  • 區別:1xx 狀態碼主要用於伺服器與客戶端之間在請求開始階段的協商,對使用者而言是透明的,主要影響底層連線行為。


2xx 成功 (Successful Responses)

  • 意義:表示客戶端的請求已成功被伺服器接收、理解、接受並處理。這是最期望的結果,意味著所請求的操作已按預期完成。

  • 常見範例

    • 200 OK:最常見的成功狀態碼。表示請求已成功,且伺服器已返回所請求的資源。對於 GET 請求,資源內容在響應主體中;對於 POST 請求,響應主體通常包含操作結果。

    • 201 Created:請求已成功,並且由於該請求而建立了一個新的資源。通常是 POSTPUT 請求的結果,響應中的 Location 標頭會指向新建立資源的 URI。

    • 202 Accepted:請求已被接受處理,但處理尚未完成。這表示請求已被放入佇列,伺服器可能在稍後完成操作。

    • 204 No Content:伺服器已成功處理請求,但響應中不包含任何內容(例如 PUTDELETE 請求,僅需確認操作完成)。

  • 區別:2xx 狀態碼明確表示操作成功,客戶端可以依賴響應內容或操作完成的確認。


3xx 重新導向 (Redirection Messages)

  • 意義:表示為了完成請求,客戶端需要採取進一步的動作。這通常涉及將客戶端重定向到不同的 URI,以獲取所需的資源。

  • 常見範例

    • 301 Moved Permanently:所請求的資源已永久性地移動到新的 URI。客戶端應更新其書籤或快取,並在未來的請求中使用新的 URI。這對於搜尋引擎優化(SEO)至關重要,因為它傳遞了頁面排名權重。

    • 302 Found (原名 "Moved Temporarily"):所請求的資源已暫時性地移動到不同的 URI。客戶端應在未來繼續使用原始 URI。

    • 303 See Other:指示客戶端應使用 GET 方法在另一個 URI 上檢索資源。常在 POST 請求後使用,以避免重新提交表單。

    • 304 Not Modified:表示客戶端條件式 GET 請求的資源自上次請求以來沒有被修改。伺服器不需要返回資源本身,客戶端應使用其快取副本。

  • 區別:3xx 狀態碼的核心在於指示資源位置的變更。理解其「永久性」與「暫時性」的差異,對於快取策略、SEO 和用戶體驗至關重要。


4xx 客戶端錯誤 (Client Error Responses)

  • 意義:表示客戶端發出的請求存在錯誤,導致伺服器無法處理。這些錯誤通常由客戶端提供不正確的語法、無效的參數、缺少必要的身份驗證或權限不足引起。

  • 常見範例

    • 400 Bad Request:伺服器無法理解請求,因為其語法無效或格式不正確。

    • 401 Unauthorized:請求需要客戶端進行身份驗證。客戶端應使用有效的憑證(例如 WWW-Authenticate 標頭)重新發送請求。

    • 403 Forbidden:伺服器理解請求,但拒絕執行。這表示客戶端沒有訪問所請求資源的權限,即使提供了有效的身份驗證憑證也可能被拒絕。

    • 404 Not Found:伺服器找不到所請求的資源。這是最常見的錯誤碼之一,通常發生在資源已被移除或 URI 不正確時。

    • 405 Method Not Allowed:請求中使用的方法(如 GET, POST, PUT, DELETE)不被目標資源或 URI 所支援。

    • 429 Too Many Requests:客戶端在給定時間內發送了過多的請求(頻率限制)。

  • 區別:4xx 狀態碼明確指出問題的根源在於客戶端的請求。對於開發者而言,這意味著需要檢查請求的結構、參數、認證或權限。


5xx 伺服器錯誤 (Server Error Responses)

  • 意義:表示伺服器在處理客戶端合法請求的過程中發生了內部錯誤,導致無法完成請求。這些錯誤與客戶端的請求本身無關,而是伺服器端應用程式或基礎設施層面的問題。

  • 常見範例

    • 500 Internal Server Error:一個通用的伺服器錯誤訊息,表示伺服器遇到了一個意外情況,阻止其完成請求。具體原因通常需要檢查伺服器端的應用程式日誌。

    • 501 Not Implemented:伺服器不支援完成請求所需的功能或方法。

    • 502 Bad Gateway:伺服器作為閘道器或代理,從上游伺服器(例如另一個網頁伺服器或應用程式伺服器)接收到無效的響應。

    • 503 Service Unavailable:伺服器目前無法處理請求,通常是因為伺服器過載或正在進行維護。這通常是暫時性的情況,響應中可能包含 Retry-After 標頭以指示何時可以再次嘗試。

    • 504 Gateway Timeout:伺服器作為閘道器或代理,沒有在規定的時間內從上游伺服器收到回應。

  • 區別:5xx 狀態碼表明問題出在伺服器端,客戶端通常無法直接解決。這些錯誤需要後端開發者或系統管理員介入,檢查伺服器應用程式、資料庫、網路配置或硬體狀況。


總結

精準理解 HTTP 狀態碼是每位網路開發者、系統管理員和 SRE(站點可靠性工程師)的必備技能。它們不僅是診斷問題的利器,更是構建高效、可靠和安全網路應用的基石。透過對這些數字背後語義的掌握,我們可以更迅速地定位問題、優化系統行為,並為使用者提供更流暢的網路體驗。

沒有留言:

張貼留言

熱門文章