狀態碼
狀態碼是來告訴客戶端,發生了什麼事情。狀態碼爲客戶端提供了一種理解事務處理結果
的便捷方式
。狀態碼位於響應的起始行中
比如,在行 HTTP/1.0 200 OK 中,狀態碼就是200
客戶端向一個 HTTP 服務器發送請求報文時,會遇到很多意想不到的情況,請求不一定能夠成功完成。服務器可能會告訴你無法找到所請求的資源,你沒有訪問資源的權限,或者資源被移到了其他地方
狀態碼是在每條響應報文的起始行中返回的。會返回一個數字狀態和一個可讀的狀態。數字碼
便於程序進行差錯處理,而原因短語
則便於人們理解
原因短語
原因短語是響應起始行中的最後一個組件。它爲狀態碼提供了文本形式
的解釋
比如,在行 HTTP/1.0 200 OK 中,OK 就是原因短語
原因短語和狀態碼是成對出現的。原因短語是狀態碼的可讀
版本,應用程序開發者將其傳送給用戶,用於說明在請求間發生了什麼情況。HTTP 規範並沒有提供任何硬性規定,要求原因短語以何種形式出現
《PHP面試問答》 https://github.com/colinlet/P...
結合實際 PHP 面試,系統的彙總面試中的各種各樣的問題,嘗試提供簡潔準確的答案。如果你在 PHP 面試中遇到問題,歡迎提 Issues 交流。包含網絡協議、數據結構與算法、PHP、Web、MySQL、Redis、Linux、安全、設計模式、架構、自我介紹、離職原因、職業規劃、準備問題等部分
如果覺得不錯歡迎 star 關注,正在不斷持續更新中~~
狀態碼分類
五大類
可以通過三位數字代碼對不同狀態碼進行分類
- 200 到 299 之間的狀態碼錶示成功
- 300 到 399 之間的代碼表示資源已經被移走了
- 400 到 499 之間的代碼表示客戶端的請求出錯了
- 500 到 599 之間的代碼表示服務器出錯了
狀態碼 | 整體範圍 | 已定義範圍 | 分類 |
---|---|---|---|
1XX | 100~199 | 100~101 | 信息提示 |
2XX | 200~299 | 200~206 | 成功 |
3XX | 300~399 | 300~305 | 重定向 |
4XX | 400~499 | 400~415 | 客戶端錯誤 |
5XX | 500~599 | 500~505 | 服務器錯誤 |
當前的 HTTP 版本只爲每類狀態定義了幾個代碼。隨着協議的發展,HTTP 規範中會正式地定義更多的狀態碼。若收到了不認識的狀態碼,可能是有人將其作爲當前協議的擴展定義
的。可以根據其所處的範圍,將它作爲那個類別中一個普通的成員來處理
例如,若收到了狀態碼 515(在 5XX 代碼的已定義範圍之外),就應該認爲這條響應指出了服務器的錯誤,這是 5XX 報文的通用類別
100 ~ 199,信息狀態碼
HTTP/1.1 向協議中引入了信息性狀態碼。這些狀態碼相對較新,關於其複雜性和感
知價值存在一些爭論,而受到限制
狀態碼 | 原因短語 | 含義 |
---|---|---|
100 | Continue | 說明收到了請求的初始部分,請客戶端繼續。發送了這個狀態碼之後,服務器在收到請求之後必須進行響應 |
101 | Switching Protocols | 說明服務器正在根據客戶端的指定,將協議切換成 Update 首部所列的協議 |
100 Continue 狀態碼的目的是對這樣的情況進行優化:HTTP 客戶端應用程序有一個實體的主體部分要發送給服務器,但希望在發送之前查看一下服務器是否會接受這個實體。客戶端應用程序只有在避免向服務器發送一個服務器無法處理或使用的大實體
,才應該使用 100 Continue
200 ~ 299,成功狀態碼
客戶端發起請求時,這些請求通常都是成功的。服務器有一組用來表示成功的狀態碼,分別對應於不同類型的請求
狀態碼 | 原因短語 | 含義 |
---|---|---|
200 | OK | 請求沒問題,實體的主體部分包含了所請求的資源 |
201 | Created | 用於創建服務器對象的請求(比如:PUT)。響應的實體主體部分中應該包含引用了已創建的資源的URL,Location首部包含的則是最具體的引擎。服務器必須在發送這個狀態碼之前創建好對象 |
202 | Accepted | 請求已被接受,服務器還未對其執行任何動作。不能保證服務器會完成這個請求;接受請求時,它看起來是有效的。服務器應在實體的主體部分包含對請求狀態的描述,或附加請求預計處理時間、信息獲取指針 |
203 | Non-Authoritative Information | 實體首部包含的信息不是來自於源端服務器,而是來自資源的副本。如果中間節點上有一份副本,但無法或沒有對元數據進行驗證,就會出現這種情況 |
204 | No Content | 響應報文中包含若干首部和一個狀態行,但沒有實體的主體部分。主要用於在瀏覽器不轉爲顯示新文檔的情況下,對其進行更新(比如刷新一個表單頁面) |
205 | Reset Content | 另一個主要用於瀏覽器的代碼。負責告知瀏覽器清除當前頁面中的所有 HTML 表單元素 |
206 | Partial Content | 成功執行了一個部分或 Range(範圍)請求。客戶端可以通過一些特殊的首部來獲取部分或某個範圍內的文檔 |
300 ~ 399,重定向狀態碼
重定向狀態碼要麼告知客戶端使用替代位置來訪問他們所感興趣的資源,要麼就提供一個替代的響應而不是資源的內容。如果資源已被移動,可發送一個重定向狀態碼和一個可選的 Location 首部來告知客戶端資源已被移走,以及現在可以在哪裏找到它。這樣,瀏覽器就可以在不打擾使用者的情況下,透明地轉入新的位置了
請求報文
GET /index.php HTTP/1.1
Host: blog.maplemark.cn
Accept: *
響應報文
HTTP/1.1 301 Moved Permanently
Server: nginx/1.12.2
Date: Fri, 19 Apr 2019 03:58:59 GMT
Content-Type: text/html; charset=UTF-8
X-Powered-By: PHP/7.2.16
Location: https://blog.maplemark.cn/
請求報文
GET / HTTP/1.1
Host: blog.maplemark.cn
Accept: *
響應報文
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 19 Apr 2019 03:59:34 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
...
狀態碼 | 原因短語 | 含義 |
---|---|---|
300 | Multiple Choices | 客戶端請求一個實際指向多個資源的URL時會返回這個狀態碼,比如服務器上有某個HTML文檔有多個語言版本。返回時會帶有一個選項列表,用戶可以選擇期望使用的那項 |
301 | Moved Permanently | 在請求的 URL 已被移除時使用。響應的 Location 首部中應該包含資源現在所處的 URL |
302 | Found | 與 301 狀態碼類似;但是,客戶端應該使用 Location 首部給出的URL 來臨時定位資源。將來的請求仍應使用老的 URL |
303 | See Other | 告知客戶端應該用另一個 URL 來獲取資源。新的 URL 位於響應報文的 Location 首部。其主要目的是允許 POST 請求的響應將客戶端定向到某個資源上去 |
304 | Not Modified | 客戶端可以通過所包含的請求首部,使其請求變成有條件的。若用戶發起了一個條件 GET 請求,而資源近期未被修改,可以通過該狀態碼錶明。帶有這個狀態碼的響應不應該包含實體的主體部分 |
305 | Use Proxy | 用來說明必須通過一個代理來訪問資源;代理的位置由 Location首部給出。客戶端是相對某個特定資源來解析這條響應的,不能假定所有請求,甚至所有對持有所請求資源的服務器的請求都通過這個代理進行。如果客戶端錯誤地讓代理介入了某條請求,可能會引發破壞性的行爲,而且會造成安全漏洞 |
306 | (未使用) | 當前未使用 |
307 | Temporary Redirect | 與 301 狀態碼類似;但客戶端應該使用 Location 首部給出的 URL來臨時定位資源。將來的請求應該使用老的 URL |
302、303 和 307 狀態碼之間存在一些交叉。這些狀態碼的用法有着細微的差別,大部分差別都源於 HTTP/1.0 和 HTTP/1.1 應用程序對這些狀態碼處理方式
的不同,爲兼容 HTTP/1.0 而保留了一些狀態碼(例如 302 狀態碼)
400 ~ 499,客戶端錯誤狀態碼
有時客戶端會發送一些服務器無法處理
的東西,比如格式錯誤的請求報文,或者最常見的是,請求一個不存在的 URL
很多客戶端錯誤都是由瀏覽器來處理的,甚至不會打擾到你。只有少量錯誤,比如404,還是會穿過瀏覽器來到用戶面前
狀態碼 | 原因短語 | 含義 |
---|---|---|
400 | Bad Request | 用於告知客戶端它發送了一個錯誤的請求 |
401 | Unauthorized | 與適當的首部一同返回,在這些首部中請求客戶端在獲取對資源的訪問權之前,對自己進行認證 |
402 | Payment Required | 現在這個狀態碼還未使用,但已經被保留,以作未來之用 |
403 | Forbidden | 用於說明請求被服務器拒絕了。如果服務器想說明爲什麼拒絕請求,可以包含實體的主體部分來對原因進行描述。但這個狀態碼通常是在服務器不想說明拒絕原因的時候使用的 |
404 | Not Found | 用於說明服務器無法找到所請求的 URL。通常會包含一個實體,以便客戶端應用程序顯示給用戶看 |
405 | Method Not Allowed | 發起的請求中帶有所請求的 URL 不支持的方法時,使用此狀態碼。應該在響應中包含 Allow 首部,以告知客戶端對所請求的資源可以使用哪些方法 |
406 | Not Acceptable | 客戶端可以指定參數來說明它們願意接收什麼類型的實體。服務器沒有與客戶端可接受的 URL 相匹配的資源時,使用此代碼。通常,服務器會包含一些首部,以便客戶端弄清楚爲什麼請求無法滿足 |
407 | Proxy Authentication Required | 與 401 狀態碼類似,但用於要求對資源進行認證的代理服務器 |
408 | Request Timeout | 如果客戶端完成請求所花的時間太長,服務器可以回送此狀態碼,並關閉連接。超時時長隨服務器的不同有所不同,但通常對所有的合法請求來說,都是夠長的 |
409 | Conflict | 用於說明請求可能在資源上引發的一些衝突。服務器擔心請求會引發衝突時,可以發送此狀態碼。響應中應該包含描述衝突的主體 |
410 | Gone | 與 404 類似,只是服務器曾經擁有過此資源。主要用於 Web 站點的維護,這樣服務器的管理者就可以在資源被移除的情況下通知客戶端了 |
411 | Length Required | 服務器要求在請求報文中包含 Content-Length 首部時使用 |
412 | Precondition Failed | 客戶端發起了條件請求,且其中一個條件失敗了的時候使用。客戶端包含了 Expect 首部時發起的就是條件請求 |
413 | Request Entity Too Large | 客戶端發送的實體主體部分比服務器能夠或者希望處理的要大時,使用此狀態碼 |
414 | Request URI Too Long | 客戶端所發請求中的請求 URL 比服務器能夠或者希望處理的要長時,使用此狀態碼 |
415 | Unsupported Media Type | 服務器無法理解或無法支持客戶端所發實體的內容類型時,使用此狀態碼 |
416 | Requested Range Not Satisfiable | 請求報文所請求的是指定資源的某個範圍,而此範圍無效或無法滿足時,使用此狀態碼 |
417 | Expectation Failed | 請求的 Expect 請求首部包含了一個期望,但服務器無法滿足此期望時,使用此狀態碼。如果代理或其他中間應用程序有確切證據說明源端服務器會爲某請求產生一個失敗的期望,就可以發送這個響應狀態碼 |
500 ~ 599,服務器錯誤狀態碼
有時客戶端發送了一條有效請求,服務器自身卻出錯了。這可能是客戶端碰上了服務器的缺陷,或者服務器上的子元素,比如某個網關資源,出了錯
代理嘗試着代表客戶端與服務器進行交流時,經常會出現問題。代理會發布 5XX 服務器錯誤狀態碼來描述所遇到的問題
狀態碼 | 原因短語 | 含義 |
---|---|---|
500 | Internal Server Error | 服務器遇到一個妨礙它爲請求提供服務的錯誤時,使用此狀態碼 |
501 | Not Implemented | 客戶端發起的請求超出服務器的能力範圍(比如,使用了服務器不支持的請求方法)時,使用此狀態碼 |
502 | Bad Gateway | 作爲代理或網關使用的服務器從請求響應鏈的下一條鏈路上收到了一條僞響應(比如,它無法連接到其父網關)時,使用此狀態碼 |
503 | Service Unavailable | 用來說明服務器現在無法爲請求提供服務,但將來可以。如果服務器知道什麼時候資源會變爲可用的,可以在響應中包含一個 RetryAfter 首部 |
504 | Gateway Timeout | 與狀態碼 408 類似,只是這裏的響應來自一個網關或代理,它們在等待另一服務器對其請求進行響應時超時了 |
505 | HTTP Version Not Supported | 服務器收到的請求使用了它無法或不願支持的協議版本時,使用此狀態碼。有些服務器應用程序會選擇不支持協議的早期版本 |
《HTTP狀態碼》 原文鏈接:https://blog.maplemark.cn/2019/04/http狀態碼.html?utm=sf