HTTP狀態碼,我都是現查現用。 我之前記得幾個經常使用的狀態碼,好比200,302,304,404, 503。 通常來講我也只須要了解這些經常使用的狀態碼就能夠了。 若是是作AJAX,REST,網絡爬蟲,機器人等程序。仍是須要了解其餘狀態碼。 本文我花了一個多月的時間把全部的狀態碼都總結了下,內容太多,看的時候麻煩耐心點了。html
HTTP狀態碼的學習資料處處都有,可是都是理論上講解。 本文介紹HTTP協議中的HTTP狀態碼(HTTP Status Code), 會對大部分的狀態碼都進行了詳細的實例講解。web
要了解狀態碼,應該在實例中去理解狀態碼的意義,不然看了也會忘記的。瀏覽器
用Fiddler工具能夠查看HTTP Request和Response, 還能夠方便地查看Response中的狀態碼緩存
爲了重現HTTP 狀態碼,本文會使用Fiddler Composer來建立「特殊的HTTP Request」服務器
HTTP狀態碼的做用是:Web服務器用來告訴客戶端,發生了什麼事。網絡
狀態碼位於HTTP Response 的第一行中,會返回一個」三位數字的狀態碼「和一個「狀態消息」。 」三位數字的狀態碼「便於程序進行處理, 「狀態消息」更便於人理解。 ide
以下圖, 當客戶端請求一個不存在的URL的時候, Web服務器會返回 「HTTP/1.1 404 Not Found」 告訴瀏覽器客戶端。 服務器沒法找到所請求的URL。工具
HTTP狀態碼被分爲五大類, 目前咱們使用的HTTP協議版本是1.1, 支持如下的狀態碼。隨着協議的發展,HTTP規範中會定義更多的狀態碼。 post
小技巧: 假如你看到一個狀態碼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服務器遇到一個錯誤,使其沒法對請求提供服務 |
這些狀態碼是HTTP 1.1引入的。 對於這些狀態碼的價值還存在爭論 (我我的歷來沒見過這些狀態碼, 也沒有理解這些狀態碼。)
狀態碼 | 狀態消息 | 含義 | 實例 |
100 | Continue(繼續) | 收到了請求的起始部分,客戶端應該繼續請求 | |
101 | Switching Protocols(切換協議) | 服務器正根據客戶端的指示將協議切換成Update Header列出的協議 |
客戶端發起請求時, 這些請求一般都是成功的。服務器有一組用來表示成功的狀態碼,分別對應於不一樣類型的請求。
狀態碼 | 狀態消息 | 含義 | 實例 |
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 |
重定向狀態碼用來告訴瀏覽器客戶端,它們訪問的資源已被移動, 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 |
有時客戶端會發送一些服務器沒法處理的東西,好比格式錯誤的Request, 或者最多見的是, 請求一個不存在的URL。
狀態碼 | 狀態消息 | 含義 | 實例 |
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(沒法知足指望) |
有時候客戶端發送了一條有效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 |
返回的Response中只有一些Header和一個狀態行, 沒有實體的主題內容(沒有response body)
204狀態碼的做用在於: 1. 在不獲取資源的狀況下了解資源的狀況(好比判斷其類型)
2. 經過查看Response中的狀態碼, 看看某個對象是否存在
3. 經過查看Header, 測試資源是否被修改了。
實例:先打開Fiddler, 而後啓動瀏覽器訪問ditu.google.cn, 你會捕獲到不少204
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(代表此次返回的內容範圍)
請求的URL已移走。Response中應該包含一個Location URL, 說明資源如今所處的位置
例如: 1. 瀏覽器客戶端訪問 http://map.google.cn
2. Web服務器返回Response 301,Location=http://titu.google.cn (告訴客戶端咱們的資源位於這裏, )
3. 瀏覽器客戶端會自動再發送一個Request 去訪問http://titu.google.cn
發送的Request中的數據有錯誤(好比:表單有錯誤,Cookie有錯誤), 這個咱們也常常見到。
實例: 還沒想到, 想到了再貼個實例上來。
Web客戶端發送的請求被Web服務器拒絕了, 若是服務器想說明爲何拒絕請求,能夠包含實體的主體部分來對緣由進行描述。但這個狀態碼一般是服務器不想說明拒絕緣由。
訪問下面的URL, 會被服務器拒絕. 而且返回403狀態碼
http://t2.baidu.com/it/u=1791561788,200960144&fm=0&gp=0.jpg
這個你們都懂的, 值得一提的是: 騰訊把404頁面作成了「尋找被拐兒童」
405是指Web服務器不支持Request中的方法。
我我的認爲狀態碼405Method Not Allowed和501 Not Implemented 是同樣的意思。都是不支持Request的方法。 (目前我還不知道這兩個的區別)
實例: 發送一個是trace方法的Request 給www.google.com
服務器要求在Request中包含Content-Length。
當瀏覽器使用Post方法,發送數據給Web服務器時, 必需要有Content-Length。這樣Web服務器才知道你要發送多少數據,不然Web服務器會返回411狀態碼
實例: 發送一個Post方法的Request 給www.google.com. Request中沒有Content-Length
做用:客戶端發送的實體主體部分比服務器可以或者但願處理的要大。 通常狀況下咱們看不到這個狀態碼。 由於瀏覽器不會發送太大的數據給網站,可是機器人可能會。
實例: 用post方法發送一個大文件(100MB以上)給www.google.com
就是說Request URI太長, 通常瀏覽器自己對URI的長度就會有限制,因此不會發送URI很長的Request. 咱們日常是根本看不到414錯誤的。 可是機器人能夠發送很長URI。
例如:咱們用Fiddler Composer發送一個很長的URI給Google, 好比 "www.google.com?q=asdfasdasf.." q=後面的參數很長。 就能夠看到414了
這個太常見了, 咱們開發網站的時候,當咱們的程序出錯了時,就會返回500錯誤。
實例:ASP.NET 程序出錯
客戶端發起的請求超出服務器的能力範圍(好比,使用了服務器不支持的請求方法)時,使用此狀態碼)。 通常的Web服務器只支持GET和POST方法。
實例: 使用Fiddler Composer 給www.qq.com, 發送一個OPTIONS 方法的Request. 服務器就能返回501了。
代理使用的服務器遇到了上游的無效響應。
Fiddler自己就是代理服務器。 當咱們訪問www.facebook.com,這網站被咱們天朝屏蔽了。 因此咱們能夠獲得502
表示Web服務器不支持此HTTP協議的版本。
衆所周知咱們如今使用的HTTP協議版本是HTTP/1.1, 若是咱們發送一個HTTP/2.0 的request 給博客園, 博客園確定不能支持HTTP/2.0,因此會返回505
想要發送這樣的request, 可使用Fiddler工具中的Composer來發送自定義的request, 以下圖。
[本文參考了: HTTP:The Definitive Guide]
轉:http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html