本文介紹HTTP協議中的HTTP狀態碼(HTTP Status Code), 會對大部分的狀態碼都進行了詳細的實例講解。
什麼是HTTP狀態碼
HTTP狀態碼的做用是:
Web服務器用來告訴
客戶端,發生了什麼事。
狀態碼位於HTTP Response 的第一行中,會返回一個」三位數字的狀態碼「和一個「狀態消息」。 」三位數字的狀態碼「便於程序進行處理, 「狀態消息」更便於人理解。
以下圖, 當客戶端請求一個不存在的
URL的時候,
Web
服務器會返回 「HTTP/1.1 404 Not Found」 告訴
瀏覽器客戶端。 服務器沒法找到所請求的URL。
狀態碼分類
HTTP狀態碼被分爲五大類, 目前咱們使用的HTTP協議版本是1.1, 支持如下的狀態碼。隨着協議的發展,HTTP規範中會定義更多的狀態碼。
小技巧: 假如你看到一個狀態碼518, 你並不知道具體518是什麼意思。 這時候你只要知道518是屬於(5XX,服務器錯誤就能夠了)
|
已定義範圍 |
分類 |
1XX |
100-101 |
信息提示 |
2XX |
200-206 |
成功 |
3XX |
300-305 |
重定向 |
4XX |
400-415 |
客戶端錯誤 |
5XX |
500-505 |
服務器錯誤 |
常見的狀態碼
通常人只須要了解如下常見的狀態碼就夠了, 若是你想了解更多, 請繼續往下看。
200 OK 服務器成功處理了請求(這個是咱們見到最多的) |
301/302 Moved Permanently(重定向)請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置 |
304 Not Modified(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存 |
404 Not Found 未找到資源 |
501 Internal Server Error服務器遇到一個錯誤,使其沒法對請求提供服務 |
1XX 信息性狀態碼
這些狀態碼是HTTP 1.1引入的。 對於這些狀態碼的價值還存在爭論 (我我的歷來沒見過這些狀態碼, 也沒有理解這些狀態碼。)
狀態碼 |
狀態消息 |
含義 |
實例 |
100 |
Continue(繼續) |
收到了請求的起始部分,客戶端應該繼續請求 |
|
101 |
Switching Protocols(切換協議) |
服務器正根據客戶端的指示將協議切換成Update Header列出的協議 |
|
2XX 成功狀態碼
客戶端發起請求時, 這些請求一般都是成功的。服務器有一組用來表示成功的狀態碼,分別對應於不一樣類型的請求
狀態碼 |
狀態消息 |
含義 |
實例 |
200 |
OK |
服務器成功處理了請求(這個是咱們見到最多的) |
HTTP協議詳解-200 |
201 |
Created(已建立) |
對於那些要服務器建立對象的請求來講,資源已建立完畢。 |
|
202 |
Accepted(已接受) |
請求已接受, 但服務器還沒有處理 |
|
203 |
Non-Authoritative Information(非權威信息) |
服務器已將事務成功處理,只是實體Header包含的信息不是來自原始服務器,而是來自資源的副本。 |
|
204 |
No Content(沒有內容) |
Response中包含一些Header和一個狀態行, 但不包括實體的主題內容(沒有response body) |
狀態碼204 |
205 |
Reset Content(重置內容) |
另外一個主要用於瀏覽器的代碼。意思是瀏覽器應該重置當前頁面上全部的HTML表單。 |
|
206 |
Partial Content(部份內容) |
部分請求成功 |
狀態碼206 |
3XX 重定向狀態碼
重定向狀態碼用來告訴瀏覽器客戶端,它們訪問的資源已被
移動, Web服務器發送一個重定向狀態碼和一個可選的Location Header, 告訴客戶端新的資源地址在哪。
瀏覽器客戶端會自動用Location中提供的地址,從新發送新的Request。 這個過程對
用戶來講是透明的。
301和302 很是類似, 一個是永久轉移,一個是臨時轉移。
(
SEO中,
搜索引擎若是碰到301, 好比網頁A用
301重定向到網頁B,
搜索引擎能夠確定網頁A永久性改變地址,就會把網頁B當作惟一有效目標)
302,303,307 是同樣。 這是由於302是HTTP 1.0定義的, HTTP1.1中使用303,307. 同時又保留了302. (但在現實中,咱們仍是用302,我是沒見過303和307)
因此這一節, 咱們只須要掌握302, 304 就能夠了。
狀態碼 |
狀態消息 |
含義 |
實例 |
300 |
Multiple Choices(多項選擇) |
客戶端請求了實際指向多個資源的URL。這個代碼是和一個選項列表一塊兒返回的,而後用戶就能夠選擇他但願的選項了 |
|
301 |
Moved Permanently(永久移除) |
請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置 |
狀態碼301 |
302 |
Found(已找到) |
與狀態碼301相似。但這裏的移除是臨時的。 客戶端會使用Location中給出的URL,從新發送新的HTTP request |
HTTP協議詳解-302 |
303 |
See Other(參見其餘) |
相似302 |
|
304 |
Not Modified(未修改) |
客戶的緩存資源是最新的, 要客戶端使用緩存 |
HTTP協議之緩存-304 |
305 |
Use Proxy(使用代理) |
必須經過代理訪問資源, 代理的地址在Response 的Location中 |
|
306 |
未使用 |
這個狀態碼當前沒使用 |
|
307 |
Temporary Redirect(臨時重定向) |
相似302 |
|
4XX客戶端錯誤狀態碼
狀態碼 |
狀態消息 |
含義 |
實例 |
400 |
Bad Request(壞請求) |
告訴客戶端,它發送了一個錯誤的請求。 |
狀態碼400 |
401 |
Unauthorized(未受權) |
須要客戶端對本身認證 |
HTTP協議之基本認證-401 |
402 |
Payment Required(要求付款) |
這個狀態還沒被使用, 保留給未來用 |
|
403 |
Forbidden(禁止) |
請求被服務器拒絕了 |
狀態碼403 |
404 |
Not Found(未找到) |
未找到資源 |
HTTP協議詳解-404 |
405 |
Method Not Allowed(不容許使用的方法) |
不支持該Request的方法。 |
狀態碼405 |
406 |
Not Acceptable(沒法接受) |
|
|
407 |
Proxy Authentication Required(要求進行代理認證) |
與狀態碼401相似, 用於須要進行認證的代理服務器 |
HTTP協議之代理-407 |
408 |
Request Timeout(請求超時) |
若是客戶端完成請求時花費的時間太長, 服務器能夠回送這個狀態碼並關閉鏈接 |
|
409 |
Conflict(衝突) |
發出的請求在資源上形成了一些衝突 |
|
410 |
Gone(消失了) |
服務器曾經有這個資源,如今沒有了, 與狀態碼404相似 |
|
411 |
Length Required(要求長度指示) |
服務器要求在Request中包含Content-Length。 |
狀態碼411 |
412 |
Precondition Failed(先決條件失敗) |
|
|
413 |
Request Entity Too Large(請求實體太大) |
客戶端發送的實體主體部分比服務器可以或者但願處理的要大 |
狀態碼413 |
414 |
Request URI Too Long(請求URI太長) |
客戶端發送的請求所攜帶的URL超過了服務器可以或者但願處理的長度 |
狀態碼414 |
415 |
Unsupported Media Type(不支持的媒體類型) |
服務器沒法理解或不支持客戶端所發送的實體的內容類型 |
|
416 |
Requested Range Not Satisfiable(所請求的範圍未獲得知足) |
|
|
417 |
Expectation Failed(沒法知足指望) |
|
|
5XX服務器錯誤狀態碼
有時候客戶端發送了一條有效Request, Web服務器自身卻出錯了。 多是Web服務器運行出錯了, 或者
網站都掛了。 5XX就是用來描述服務器錯誤的。
狀態碼 |
狀態消息 |
含義 |
實例 |
500 |
Internal Server Error(內部服務器錯誤) |
服務器遇到一個錯誤,使其沒法爲請求提供服務 |
狀態碼500 |
501 |
Not Implemented(未實現) |
客戶端發起的請求超出服務器的能力範圍(好比,使用了服務器不支持的請求方法)時,使用此狀態碼。 |
狀態碼501 |
502 |
Bad Gateway(網關故障) |
代理使用的服務器遇到了上游的無效響應 |
狀態碼502 |
503 |
Service Unavailable(未提供此服務) |
服務器目前沒法爲請求提供服務,但過一段時間就能夠恢復服務 |
|
504 |
Gateway Timeout(網關超時) |
與狀態嗎408相似, 可是響應來自網關或代理,此網關或代理在等待另外一臺服務器的響應時出現了超時 |
|
505 |
HTTP Version Not Supported(不支持的HTTP版本) |
服務器收到的請求使用了它不支持的HTTP協議版本。 有些服務器不支持HTTP早期的HTTP協議版本,也不支持過高的協議版本 |
狀態碼505 |
204 No Content(沒有內容)
返回的Response中只有一些Header和一個狀態行, 沒有實體的主題內容(沒有response body)
204狀態碼的做用在於: 1. 在不獲取資源的狀況下了解資源的狀況(好比判斷其類型)
2. 經過查看Response中的狀態碼, 看看某個對象是否存在
3. 經過查看Header, 測試資源是否被修改了。
實例:先打開Fiddler, 而後啓動瀏覽器訪問ditu.
google.cn, 你會捕獲到不少204
206 Partial Content(部份內容)
206狀態碼錶明服務器已經成功處理了部分GET請求(只有發送GET 方法的request, web服務器纔可能返回206),
應用場景:
1. FlashGet,
迅雷或者HTTP
下載工具都是使用206狀態碼來實現斷點續傳
2. 將以個大文檔分解爲多個下載段同時下載 好比,在線看
視頻
實例: 一些流媒體技術好比在線視頻,能夠邊看邊下載。 就是使用206來實現的。
打開Fiddler, 而後用瀏覽器打開「
搜狐視頻中的綠箭俠」 http://tv.sohu.com/20121011/n354681393.shtml而後你在Fiddler中就能看到一堆的206
1. 瀏覽器發送一個Get 方法的request. header中包含 Range: bytes=5303296-5336063. (意思就是請求獲得5303296-5336063這個範圍的
數據)。
2. Web服務器返回一個206 的Response. header中包含Content-Range: bytes 5303296-5336063/12129376(代表此次返回的內容範圍)
301 Moved Permanently(永久移除)
請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置
例如: 1. 瀏覽器客戶端訪問 http://map.google.cn
2. Web服務器返回Response 301,Location=http://titu.google.cn (告訴客戶端咱們的資源位於這裏, )
3. 瀏覽器客戶端會自動再發送一個Request 去訪問http://titu.google.cn
400 Bad Request(壞請求)
發送的Request中的數據有錯誤(好比:表單有錯誤,Cookie有錯誤), 這個咱們也常常見到。
實例: 還沒想到, 想到了再貼個實例上來。
403 Forbidden(禁止)
Web客戶端發送的請求被Web服務器拒絕了, 若是服務器想說明爲何拒絕請求,能夠包含實體的主體部分來對緣由進行描述。但這個狀態碼一般是服務器不想說明拒絕緣由。
訪問下面的URL, 會被服務器拒絕. 而且返回403狀態碼
http://t2.baidu.com/it/u=1791561788,200960144&fm=0&gp=0.jpg
404 Page not Found (請求的資源不存在)
這個你們都懂的, 值得一提的是:
騰訊把
404頁面作成了「尋找被拐兒童」
405 Method Not Allowed(不容許使用的方法)
405是指Web服務器不支持Request中的方法。
我我的認爲狀態碼405Method Not Allowed和501 Not Implemented 是同樣的意思。都是不支持Request的方法。 (目前我還不知道這兩個的區別)
實例: 發送一個是trace方法的Request 給www.google.com
411 Length Required(要求長度指示)
服務器要求在Request中包含Content-Length。
當瀏覽器使用P
ost方法,發送數據給Web服務器時, 必需要有Content-Length。這樣Web服務器才知道你要發送多少數據,不然Web服務器會返回411狀態碼
實例: 發送一個Post方法的Request 給www.google.com. Request中沒有Content-Length
413 Request Entity Too Large(請求實體太大)
做用:客戶端發送的實體主體部分比服務器可以或者但願處理的要大。 通常狀況下咱們看不到這個狀態碼。 由於瀏覽器不會發送太大的數據給網站,可是
機器人可能會。
實例: 用post方法發送一個大文件(100MB以上)給www.google.com
414 Request URI Too Long(請求URI太長)
就是說Request URI太長, 通常瀏覽器自己對URI的長度就會有限制,因此不會發送URI很長的Request. 咱們日常是根本看不到414錯誤的。 可是機器人能夠發送很長URI。
例如:咱們用Fiddler Composer發送一個很長的URI給Google, 好比 "www.google.com?q=asdfasdasf.." q=後面的參數很長。 就能夠看到414了
500 Internal Server Error(內部服務器錯誤)
這個太常見了, 咱們開發網站的時候,當咱們的程序出錯了時,就會返回500錯誤。
實例:
ASP.NET 程序出錯
501 Not Implemented(未實現)
客戶端發起的請求超出服務器的能力範圍(好比,使用了服務器不支持的請求方法)時,使用此狀態碼)。 通常的Web服務器只支持GET和POST方法。
實例: 使用Fiddler Composer 給www.qq.com, 發送一個OPTIONS 方法的Request. 服務器就能返回501了。
502 Bad Gateway(網關故障)
代理使用的服務器遇到了上游的無效響應。
Fiddler自己就是代理服務器。 當咱們訪問www.facebook.com,這網站被咱們天朝屏蔽了。 因此咱們能夠獲得502
505 HTTP Version Not Supported(不支持的HTTP版本)
表示Web服務器不支持此HTTP協議的版本。
衆所周知咱們如今使用的HTTP協議版本是HTTP/1.1, 若是咱們發送一個HTTP/2.0 的request 給
博客園, 博客園確定不能支持HTTP/2.0,因此會返回505
想要發送這樣的request, 可使用Fiddler工具中的Composer來發送自定義的request, 以下圖。