天天看點

HTTP狀态碼大全

完整的 HTTP 1.1規範說明書來自于RFC 2616,你可以在

http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b3Iub3JnLw%3D%3D

線上查閱。HTTP 1.1的狀态碼被标記為新特性,因為許多浏覽器隻支援 HTTP 1.0。你應隻把狀态碼發送給支援 HTTP 1.1的用戶端,支援協定版本可以通過調用request.getRequestProtocol來檢查。

本部分餘下的内容會詳細地介紹 HTTP 1.1中的狀态碼。這些狀态碼被分為五大類:

100-199 用于指定用戶端應相應的某些動作。

200-299 用于表示請求成功。

300-399 用于已經移動的檔案并且常被包含在定位頭資訊中指定新的位址資訊。

400-499 用于指出用戶端的錯誤。

500-599 用于支援伺服器錯誤。

HttpServletResponse中的常量代表關聯不同标準消息的狀态碼。在servlet程式中,你會更多地用到這些常量的辨別來使用狀态碼。例如:你一般會使用response.setStatus(response.SC_NO_CONTENT)而不是 response.setStatus(204),因為後者不易了解而且容易導緻錯誤。但是,你應當注意到伺服器允許對消息輕微的改變,而用戶端隻注意狀态碼的數字值。是以伺服器可能隻傳回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK。

100 (Continue/繼續)

如果伺服器收到頭資訊中帶有100-continue的請求,這是指用戶端詢問是否可以在後續的請求中發送附件。在這種情況下,伺服器用100(SC_CONTINUE)允許用戶端繼續或用417 (Expectation Failed)告訴用戶端不同意接受附件。這個狀态碼是 HTTP 1.1中新加入的。

101 (Switching Protocols/轉換協定)

101 (SC_SWITCHING_PROTOCOLS)狀态碼是指伺服器将按照其上的頭資訊變為一個不同的協定。這是 HTTP 1.1中新加入的。

200 (OK/正常)

200 (SC_OK)的意思是一切正常。一般用于相應GET和POST請求。這個狀态碼對servlet是預設的;如果沒有調用setStatus方法的話,就會得到200。

201 (Created/已建立)

201 (SC_CREATED)表示伺服器在請求的響應中建立了新文檔;應在定位頭資訊中給出它的URL。

202 (Accepted/接受)

202 (SC_ACCEPTED)告訴用戶端請求正在被執行,但還沒有處理完。

203 (Non-Authoritative Information/非官方資訊)

狀态碼203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文檔被正常的傳回,但是由于正在使用的是文檔副本是以某些響應頭資訊可能不正确。這是 HTTP 1.1中新加入的。

204 (No Content/無内容)

在并沒有新文檔的情況下,204 (SC_NO_CONTENT)確定浏覽器繼續顯示先前的文檔。這各狀态碼對于使用者周期性的重載某一頁非常有用,并且你可以确定先前的頁面是否已經更新。例如,某個servlet可能作如下操作:

int pageVersion =Integer.parseInt(request.getParameter("pageVersion"));

if (pageVersion >;= currentVersion) {

   response.setStatus(response.SC_NO_CONTENT);

} else {

       // Create regular page

}

但是,這種方法對通過重新整理響應頭資訊或等價的HTML标記自動重載的頁面起作用,因為它會傳回一個204狀态碼停止以後的重載。但基于JavaScript腳本的自動重載在這種情況下仍然需要能夠起作用。可以閱讀本書7.2 ( HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1響應頭資訊以及他們的意義)部分的詳細讨論。

205 (Reset Content/重置内容)

重置内容205 (SC_RESET_CONTENT)的意思是雖然沒有新文檔但浏覽器要重置文檔顯示。這個狀态碼用于強迫浏覽器清除表單域。這是 HTTP 1.1中新加入的。

206 (Partial Content/局部内容)

206 (SC_PARTIAL_CONTENT)是在伺服器完成了一個包含Range頭資訊的局部請求時被發送的。這是 HTTP 1.1中新加入的。

300 (Multiple Choices/多重選擇)

300 (SC_MULTIPLE_CHOICES)表示被請求的文檔可以在多個地方找到,并将在傳回的文檔中列出來。如果伺服器有首選設定,首選項将會被列于定位響應頭資訊中。

301 (Moved Permanently)

301 (SC_MOVED_PERMANENTLY)狀态是指所請求的文檔在别的地方;文檔新的URL會在定位響應頭資訊中給出。浏覽器會自動連接配接到新的URL。

302 (Found/找到)

與301有些類似,隻是定位頭資訊中所給的URL應被了解為臨時交換位址而不是永久的。注意:在 HTTP 1.0中,消息是臨時移動(Moved Temporarily)的而不是被找到,是以HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我們以為的SC_FOUND。

注意

代表狀态碼302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND。

狀态碼302是非常有用的因為浏覽器自動連接配接在定為響應頭資訊中給出的新URL。這非常有用,而且為此有一個專門的方法——sendRedirect。使用response.sendRedirect(url)比調用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location", url)多幾個好處。首先,response.sendRedirect(url)方法明顯要簡單和容易。第二,servlet自動建立一頁儲存這一連接配接以提供給那些不能自動轉向的浏覽器顯示。最後,在servlet 2.2版本(J2EE中的版本)中,sendRedirect能夠處理相對路徑,自動轉換為絕對路徑。但是你隻能在2.1版本中使用絕對路徑。

如果你将使用者轉向到站點的另一頁中,你要用 HttpServletResponse 中的 encodeURL 方法傳送URL。這麼做可預防不斷使用基于URL重寫的會話跟蹤的情況。URL重寫是一種在你的網站跟蹤不使用 cookies 的使用者的方法。這是通過在每一個URL尾部附加路徑資訊實作的,但是 servlet 會話跟蹤API會自動的注意這些細節。會話跟蹤在第九章讨論,并且養成使用 encodeURL 的習慣會使以後添加會話跟蹤的功能更容易很多。

核心技巧

如果你将使用者轉向到你的站點的其他頁面,用 response.sendRedirect(response.encodeURL(url)) 的方式事先計劃好會話跟蹤(session tracking)要比隻是調用 response.sendRedirect(url) 好的多。

這個狀态碼有時可以與301交換使用。例如,如果你錯誤的通路了

http://www.talentdigger.cn/home/link.php?url=aG9zdC9%2BdXNlcg%3D%3D

(路徑資訊不完整),有些伺服器就會回複301狀态碼而有些則回複302。從技術上說,如果最初的請求是GET浏覽器隻是被假定自動轉向。如果想了解更多細節,請看狀态碼307的讨論。

303 (See Other/參見其他資訊)

這個狀态碼和 301、302 相似,隻是如果最初的請求是 POST,那麼新文檔(在定位頭資訊中給出)藥用 GET 找回。這個狀态碼是新加入 HTTP 1.1中的。

304 (Not Modified/為修正)

當用戶端有一個緩存的文檔,通過提供一個 If-Modified-Since 頭資訊可指出用戶端隻希望文檔在指定日期之後有所修改時才會重載此文檔,用這種方式可以進行有條件的請求。304 (SC_NOT_MODIFIED)是指緩沖的版本已經被更新并且用戶端應重新整理文檔。另外,伺服器将傳回請求的文檔及狀态碼 200。servlet一般情況下不會直接設定這個狀态碼。它們會實作getLastModified方法并根據修正日期讓預設服務方法處理有條件的請求。這個方法的例程已在2.8部分(An Example Using Servlet Initialization and Page Modification Dates/一個使用servlet初始化和頁面修正日期的例子)給出。

305 (Use Proxy/使用代理)

305 (SC_USE_PROXY)表示所請求的文檔要通過定位頭資訊中的代理伺服器獲得。這個狀态碼是新加入 HTTP 1.1中的。

307 (Temporary Redirect/臨時重定向)

浏覽器處理307狀态的規則與302相同。307狀态被加入到 HTTP 1.1中是由于許多浏覽器在收到302響應時即使是原始消息為POST的情況下仍然執行了錯誤的轉向。隻有在收到303響應時才假定浏覽器會在POST請求時重定向。添加這個新的狀态碼的目的很明确:在響應為303時按照GET和POST請求轉向;而在307響應時則按照GET請求轉向而不是POST請求。注意:由于某些原因在HttpServletResponse中還沒有與這個狀态對應的常量。該狀态碼是新加入HTTP 1.1中的。

在 HttpServletResponse 中沒有 SC_TEMPORARY_REDIRECT 常量,是以你隻能顯示的使用307狀态碼。

400 (Bad Request/錯誤請求)

400 (SC_BAD_REQUEST)指出用戶端請求中的文法錯誤。

401 (Unauthorized/未授權)

401 (SC_UNAUTHORIZED)表示用戶端在授權頭資訊中沒有有效的身份資訊時通路受到密碼保護的頁面。這個響應必須包含一個WWW-Authenticate的授權資訊頭。例如,在本書4.5部分中的“Restricting Access to Web Pages./限制通路Web頁。”

403 (Forbidden/禁止)

403 (SC_FORBIDDEN)的意思是除非擁有授權否則伺服器拒絕提供所請求的資源。這個狀态經常會由于伺服器上的損壞檔案或目錄許可而引起。

404 (Not Found/未找到)

404 (SC_NOT_FOUND)狀态每個網絡程式員可能都遇到過,他告訴用戶端所給的位址無法找到任何資源。它是表示“沒有所通路頁面”的标準方式。這個狀态碼是常用的響應并且在HttpServletResponse類中有專門的方法實作它:sendError("message")。相對于setStatus使用sendError得好處是:伺服器會自動生成一個錯誤頁來顯示錯誤資訊。但是,Internet Explorer 5浏覽器卻預設忽略你發揮的錯誤頁面并顯示其自定義的錯誤提示頁面,雖然微軟這麼做違反了 HTTP 規範。要關閉此功能,在工具菜單裡,選擇Internet選項,進入進階标簽頁,并确認“顯示友好的 HTTP 錯誤資訊”選項(在我的浏覽器中是倒數第8各選項)沒有被選。但是很少有使用者知道此選項,是以這個特性被IE5隐藏了起來使使用者無法看到你所傳回給使用者的資訊。而其他主流浏覽器及IE4都完全的顯示伺服器生成的錯誤提示頁面。可以參考圖6-3及6-4中的例子。

核心警告

預設情況下,IE5忽略服務端生成的錯誤提示頁面。

405 (Method Not Allowed/方法未允許)

405 (SC_METHOD_NOT_ALLOWED)指出請求方法(GET, POST, HEAD, PUT, DELETE, 等)對某些特定的資源不允許使用。該狀态碼是新加入 HTTP 1.1中的。

406 (Not Acceptable/無法通路)

406 (SC_NOT_ACCEPTABLE)表示請求資源的MIME類型與用戶端中Accept頭資訊中指定的類型不一緻。見本書7.2部分中的表7.1(HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1響應頭資訊以及他們的意義)中對MIME類型的介紹。406是新加入 HTTP 1.1中的。

407 (Proxy Authentication Required/代理伺服器認證要求)

407 (SC_PROXY_AUTHENTICATION_REQUIRED)與401狀态有些相似,隻是這個狀态用于代理伺服器。該狀态指出用戶端必須通過代理伺服器的認證。代理伺服器傳回一個Proxy-Authenticate響應頭資訊給用戶端,這會引起用戶端使用帶有Proxy-Authorization請求的頭資訊重新連接配接。該狀态碼是新加入 HTTP 1.1中的。

408 (Request Timeout/請求逾時)

408 (SC_REQUEST_TIMEOUT)是指服務端等待用戶端發送請求的時間過長。該狀态碼是新加入 HTTP 1.1中的。

409 (Conflict/沖突)

該狀态通常與PUT請求一同使用,409 (SC_CONFLICT)狀态常被用于試圖上傳版本不正确的檔案時。該狀态碼是新加入 HTTP 1.1中的。

410 (Gone/已經不存在)

410 (SC_GONE)告訴用戶端所請求的文檔已經不存在并且沒有更新的位址。410狀态不同于404,410是在指導文檔已被移走的情況下使用,而404則用于未知原因的無法通路。該狀态碼是新加入 HTTP 1.1中的。

411 (Length Required/需要資料長度)

411 (SC_LENGTH_REQUIRED)表示伺服器不能處理請求(假設為帶有附件的POST請求),除非用戶端發送Content-Length頭資訊指出發送給伺服器的資料的大小。該狀态是新加入 HTTP 1.1的。

412 (Precondition Failed/先決條件錯誤)

412 (SC_PRECONDITION_FAILED)狀态指出請求頭資訊中的某些先決條件是錯誤的。該狀态是新加入 HTTP 1.1的。

413 (Request Entity Too Large/請求實體過大)

413 (SC_REQUEST_ENTITY_TOO_LARGE)告訴用戶端現在所請求的文檔比伺服器現在想要處理的要大。如果伺服器認為能夠過一段時間處理,則會包含一個Retry-After的響應頭資訊。該狀态是新加入 HTTP 1.1的。

414 (Request URI Too Long/請求URI過長)

414 (SC_REQUEST_URI_TOO_LONG)狀态用于在URI過長的情況時。這裡所指的“URI”是指URL中主機、域名及端口号之後的内容。例如:在URL--http://www.y2k-disaster.com:8080/we/look/silly/now/中URI是指/we/look/silly/now/。該狀态是新加入 HTTP 1.1的。

415 (Unsupported Media Type/不支援的媒體格式)

415 (SC_UNSUPPORTED_MEDIA_TYPE)意味着請求所帶的附件的格式類型伺服器不知道如何處理。該狀态是新加入 HTTP 1.1的。

416 (Requested Range Not Satisfiable/請求範圍無法滿足)

416表示用戶端包含了一個伺服器無法滿足的Range頭資訊的請求。該狀态是新加入 HTTP 1.1的。奇怪的是,在servlet 2.1版本API的HttpServletResponse中并沒有相應的常量代表該狀态。

在servlet 2.1的規範中,類HttpServletResponse并沒有SC_REQUESTED_RANGE_NOT_SATISFIABLE 這樣的常量,是以你隻能直接使用416。在servlet 2.2版本之後都包含了此常量。

417 (Expectation Failed/期望失敗)

如果伺服器得到一個帶有100-continue值的Expect請求頭資訊,這是指用戶端正在詢問是否可以在後面的請求中發送附件。在這種情況下,伺服器也會用該狀态(417)告訴浏覽器伺服器不接收該附件或用100 (SC_CONTINUE)狀态告訴用戶端可以繼續發送附件。該狀态是新加入 HTTP 1.1的。

500 (Internal Server Error/内部伺服器錯誤)

500 (SC_INTERNAL_SERVER_ERROR) 是常用的“伺服器錯誤”狀态。該狀态經常由CGI程式引起也可能(但願不會如此!)由無法正常運作的或傳回頭資訊格式不正确的servlet引起。

501 (Not Implemented/未實作)

501 (SC_NOT_IMPLEMENTED)狀态告訴用戶端伺服器不支援請求中要求的功能。例如,用戶端執行了如PUT這樣的伺服器并不支援的指令。

502 (Bad Gateway/錯誤的網關)

502 (SC_BAD_GATEWAY)被用于充當代理或網關的伺服器;該狀态指出接收伺服器接收到遠端伺服器的錯誤響應。

503 (Service Unavailable/服務無法獲得)

狀态碼503 (SC_SERVICE_UNAVAILABLE)表示伺服器由于在維護或已經超載而無法響應。例如,如果某些線程或資料庫連接配接池已經沒有空閑則servlet會傳回這個頭資訊。伺服器可提供一個Retry-After頭資訊告訴用戶端什麼時候可以在試一次。

504 (Gateway Timeout/網關逾時)

該狀态也用于充當代理或網關的伺服器;它指出接收伺服器沒有從遠端伺服器得到及時的響應。該狀态是新加入 HTTP 1.1的。

505 (HTTP Version Not Supported/不支援的 HTTP 版本)

505 (SC_HTTP_VERSION_NOT_SUPPORTED)狀态碼是說伺服器并不支援在請求中所标明 HTTP 版本。該狀态是新加入 HTTP 1.1的。

繼續閱讀