﻿# 網頁開發人員應了解的 HTTP 狀態碼

我想一般人對於 [HTTP 狀態碼](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)(Status Code) 多少會有些印象，例如 HTTP 200 代表網頁正常、404 代表找不到網頁。但似乎一般人大多不曾仔細研究所有 [HTTP 狀態碼](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)的定義，以及 [HTTP 狀態碼](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)到底對開發人員來說有何影響。

我承認，就算你完全不瞭解 [HTTP Status Code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) 也可以開發出一個網站，若你寫的是 ASP.NET 也通常不會影響你的開發作業，因為 ASP.NET 已經包裝的很好了。

但是若網站架構越來越大，需要微調的時候，或是系統整合需要整合到更底層的網路作業時，若不瞭解這些代碼的意義 (或根本不知道有 HTTP 狀態碼這玩意)，可能很容易就會遇到瓶頸，尤其是在除錯的時候更加明顯，我就曾經看過有人因為網頁收到 404 的錯誤訊息還一直在找程式哪裡出錯了，完全沒想到是自己網址打錯。

[HTTP 狀態碼](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)指的是從伺服器端回應(HTTP Response)的狀態，對於狀態的分類可區分三個層級，分別用三個數字表示，第一個數字為大類、第二個數字為中類、第三個數字為小類。完整的狀態碼定義可以參考 [RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1](http://www.w3.org/Protocols/rfc2616/rfc2616.html) 的 [10 Status Code Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) 章節，裡面有完整且詳盡的說明。

不過在 IIS 中有不少微軟自訂的擴充狀態碼，格式類似 404.0 這樣，清楚的狀態碼對於除錯很有幫助。

[HTTP 狀態碼](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)大致分成 5 類 (粗體表示)，完整的狀態碼概述如下：

-   **1xx - 參考資訊 (Informational)**  
    這些狀態碼代表主機先暫時回應用戶端一個狀態，所以在接收一般的回應之前，用戶端應準備接收一個或多個 1xx 的回應。我以前在寫 ASP 的時候比較有看到 IIS 使用到這些狀態碼回應，在 Apache 的環境我還未曾遇到過。
    -   100 - 繼續。
    -   101 - 切換通訊協定。
-   **2xx - 成功 (OK)**  
    這類的狀態碼表示伺服器成功接收到用戶端要求、理解用戶端要求、以及接受用戶端要求。
    -   200 - 確定。 用戶端要求成功。
    -   201 - 已建立。
    -   202 - 已接受。
    -   203 - 非授權資訊。
    -   204 - 無內容。
    -   205 - 重設內容。
    -   206 - 部分內容。
    -   207 - 多重狀態 ([WebDAV](http://en.wikipedia.org/wiki/WebDAV)) -- 這好像只有在 IIS 中才有，HTTP/1.1 並沒有定義這個狀態。這狀態會出現在可以包含多個不同回應代碼 (視子要求數量而定) 的 XML 訊息之前。
-   **3xx - 重新導向 (Redirection)**  
    用戶端瀏覽器必須採取更多動作才能完成要求。例如：瀏覽器可能必須重新發出 HTTP Request 要求伺服器上的不同頁面。
    -   301 - 要求的網頁已經永久改變網址。此狀態要求用戶端未來在連結此網址時應該導向至指定的 URI。
    -   302 - 物件已移動，並告知移動過去的網址。針對表單架構驗證，這通常表示為「物件已移動」。 要求的資源暫時存於不同的 URI 底下。 由於重新導向可能偶而改變，用戶端應繼續使用要求 URI 來執行未來的要求。 除非以 Cache-Control 或 Expires 標頭欄位表示，此回應才能夠快取。  
        ASP.NET 預設的 [Response.Redirect 方法](http://msdn.microsoft.com/zh-tw/library/a8wa7sdt.aspx)，就是以 302 Found 做回應。
    -   303 - 通知 Client 連到另一個網址去查看上傳表單的結果(POST 變成 GET)，當使用程式作網頁轉向時，會回應此訊息。  
        在 ASP.NET 中要輸出 HTTP 303 轉向的程式碼如下：
        
        ```
        Response.StatusCode = 303;
        Response.RedirectLocation = "/PageB.aspx";
        ```
        
    -   304 - 未修改。用戶端要求該網頁時，其內容並沒有變更，應該回傳 304 告知網頁未修改。此時用戶端僅需要取得本地快取(Local Cache)的副本即可。
    -   305 - 要求的網頁必須透過 Server 指定的 proxy 才能觀看 ( 透過 Location 標頭 )
    -   306 - (未使用) 此代碼僅用來為了向前相容而已。
    -   307 - 暫時重新導向。要求的網頁只是「暫時」改變網址而已。
-   **4xx - 用戶端錯誤 (Client Error)**  
    這代表錯誤發生，且這錯誤的發生的原因跟「用戶端」有關。例如：用戶端可能連結到不存在的頁面、用戶端的權限不足、或可能未提供有效的驗證資訊(輸入的帳號、密碼錯誤)。下次看到 4xx 的回應千萬不要傻傻的一直查程式哪裡寫錯誤了(不過也有可能是程式造成的)。
    -   400 - 錯誤的要求。
    -   401 - 拒絕存取。 IIS 定義數個不同的 401 錯誤，以表示更詳細的錯誤原因。 這些特定的錯誤碼會顯示在瀏覽器中，但不會顯示在 IIS 記錄檔中：
        -   401.1 - 登入失敗。
        -   401.2 - 因為伺服器設定導致登入失敗。
        -   401.3 - 因為資源上的 ACL 而沒有授權。
        -   401.4 - 篩選授權失敗。
        -   401.5 - ISAPI/CGI 應用程式授權失敗。
        -   401.7 - Web 伺服器上的 URL 授權原則拒絕存取。 這是 IIS 6.0 專用的錯誤碼。
    -   403 - 禁止使用。 IIS 定義數個不同的 403 錯誤，以表示更詳細的錯誤原因：
        -   403.1 - 禁止執行存取。
        -   403.2 - 禁止讀取存取。
        -   403.3 - 禁止寫入存取。
        -   403.4 - 需要 SSL。
        -   403.5 - 需要 SSL 128。
        -   403.6 - IP 位址遭拒。
        -   403.7 - 需要用戶端憑證。
        -   403.8 - 網站存取遭拒。
        -   403.9 - 使用者過多。
        -   403.10 - 設定無效。
        -   403.11 - 密碼變更。
        -   403.12 - 對應程式拒絕存取。
        -   403.13 - 用戶端憑證已撤銷。
        -   403.14 - 目錄清單遭拒。
        -   403.15 - 超過用戶端存取授權數量。
        -   403.16 - 用戶端憑證不受信任或無效。
        -   403.17 - 用戶端憑證已經過期或尚未生效。
        -   403.18 - 無法在目前的應用程式集區中執行要求的 URL。 這是 IIS 6.0 專用的代碼。
        -   403.19 - 無法在這個應用程式集區中執行用戶端的 CGI。 這是 IIS 6.0 專用的代碼。
        -   403.20 - Passport 登入失敗。 這是 IIS 6.0 專用的錯誤碼。
    -   404 - 找不到。
        -   404.0 - (無) – 找不到檔案或目錄。
        -   404.1 - 無法在要求的連接埠上存取網站。
        -   404.2 - 網頁服務延伸鎖定原則阻止這個要求。
        -   404.3 - MIME 對應原則阻止這個要求。
    -   405 - 用來存取這個頁面的 HTTP 動詞不受允許 (方法不受允許)。
    -   406 - 用戶端瀏覽器不接受要求頁面的 MIME 類型。
    -   407 - 需要 Proxy 驗證。
    -   412 - 指定條件失敗。
    -   413 - 要求的實體太大。
    -   414 - 要求 URI 太長。
    -   415 - 不支援的媒體類型。
    -   416 - 無法滿足要求的範圍。
    -   417 - 執行失敗。
    -   423 - 鎖定錯誤。
-   **5xx - 伺服器錯誤 (Server Error)**  
    這代表錯誤發生，且這錯誤發生的原因跟「伺服器」有關。伺服器因為發生錯誤或例外狀況(Exception)而無法完成要求(Request)時，就會回應 5xx 的錯誤，且這肯定跟伺服器有關。
    -   500 - 內部伺服器錯誤。
        -   500.12 - 應用程式正忙於在 Web 伺服器上重新啟動。
        -   500.13 - Web 伺服器過於忙碌。
        -   500.15 - 不允許直接要求 Global.asa。
        -   500.16 – UNC 授權認證不正確。 這是 IIS 6.0 專用的錯誤碼。
        -   500.18 – 無法開啟 URL 授權存放區。 這是 IIS 6.0 專用的錯誤碼。
        -   500.19 - 此檔案的資料在 Metabase 中設定不當。
        -   500.100 - 內部的 ASP 錯誤。
    -   501 – 標頭值指定未實作的設定。
    -   502 - Web 伺服器在作為閘道或 Proxy 時收到無效的回應。
        -   502.1 - CGI 應用程式逾時。
        -   502.2 - CGI 應用程式中發生錯誤。
    -   503 - 服務無法使用。 這是 IIS 6.0 專用的錯誤碼。
    -   504 - 閘道逾時。
    -   505 - 不支援的 HTTP 版本。

至於詳細的狀態碼說明可參考以下相關連結：

-   [HTTP/1.1: Status Code Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) \[英文\]
-   [IIS 狀態碼說明](http://support.microsoft.com/kb/318380/zh-tw)
-   [HTTP 狀態碼](http://vincent119.blogspot.com/2008/06/100-continue-client-client-client.html)
-   HTTP 狀態碼代表什麼意義？
-   [HTTP Extensions for Distributed Authoring -- WEBDAV](http://www.webdav.org/specs/rfc2518.html)
-   [List of HTTP status codes - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/List_of_HTTP_status_codes)
