HTTP狀態(tài)碼與304狀態(tài)碼詳解

HTTP 狀態(tài)碼負(fù)責(zé)表示客戶端 HTTP 請(qǐng)求的返回結(jié)果、標(biāo)記服務(wù)器端的處理是否正常、通知出現(xiàn)的錯(cuò)誤等工作。所以需要好好了解一下狀態(tài)碼的工作機(jī)制。




2XX 成功

2XX 的響應(yīng)結(jié)果表明請(qǐng)求被正常處理了。

200 OK

表示從客戶端發(fā)來的請(qǐng)求在服務(wù)器端被正常處理了。在響應(yīng)報(bào)文內(nèi),隨狀態(tài)碼一起返回的信息會(huì)因方法的不同而發(fā)生改變。比如,使用 GET 方法時(shí),對(duì)應(yīng)請(qǐng)求資源的實(shí)體會(huì)作為響應(yīng)返回;而使用 HEAD 方法時(shí),對(duì)應(yīng)請(qǐng)求資源的實(shí)體首部不隨報(bào)文主體作為響應(yīng)返回(即在響應(yīng)中只返回首部,不會(huì)返回實(shí)體的主體部分)。

204 No Content

該狀態(tài)碼代表服務(wù)器接收的請(qǐng)求已成功處理,但在返回的響應(yīng)報(bào)文中不含實(shí)體的主體部分。另外,也不允許返回任何實(shí)體的主體。比如,當(dāng)從瀏覽器發(fā)出請(qǐng)求處理后,返回 204 響應(yīng),那么瀏覽器顯示的頁面不發(fā)生更新。一般在只需要從客戶端往服務(wù)器發(fā)送信息,而對(duì)客戶端不需要發(fā)送新信息內(nèi)容的情況下使用。

206 Partial Content

該狀態(tài)碼表示客戶端進(jìn)行了范圍請(qǐng)求,而服務(wù)器成功執(zhí)行了這部分的GET 請(qǐng)求。響應(yīng)報(bào)文中包含由 Content-Range 指定范圍的實(shí)體內(nèi)容。



3XX 重定向

3XX 響應(yīng)結(jié)果表明瀏覽器需要執(zhí)行某些特殊的處理以正確處理請(qǐng)求。

301 Moved Permanently

永久性重定向。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的 URI,以后應(yīng)使用資源現(xiàn)在所指的 URI。也就是說,如果已經(jīng)把資源對(duì)應(yīng)的 URI

保存為書簽了,這時(shí)應(yīng)該按 Location 首部字段提示的 URI 重新保存。

像下方給出的請(qǐng)求 URI,當(dāng)指定資源路徑的最后忘記添加斜杠“/”,就會(huì)產(chǎn)生 301 狀態(tài)碼。

http://example.com/sample

302 Found

臨時(shí)性重定向。該狀態(tài)碼表示請(qǐng)求的資源已被分配了新的 URI,希望用戶(本次)能使用新的 URI 訪問。和 301 Moved Permanently 狀態(tài)碼相似,但 302 狀態(tài)碼代表的資源不是被永久移動(dòng),只是臨時(shí)性質(zhì)的。換句話說,已移動(dòng)的資源對(duì)應(yīng)的URI 將來還有可能發(fā)生改變。比如,用戶把 URI 保存成書簽,但不會(huì)像 301 狀態(tài)碼出現(xiàn)時(shí)那樣去更新書簽,而是仍舊保留返回 302 狀態(tài)碼的頁面對(duì)應(yīng)的 URI。

304 Not Modified

該狀態(tài)碼表示客戶端發(fā)送附帶條件的請(qǐng)求 2 時(shí),服務(wù)器端允許請(qǐng)求訪問資源,但未滿足條件的情況。304 狀態(tài)碼返回時(shí),不包含任何響應(yīng)的主體部分。304 雖然被劃分在 3XX 類別中,但是和重定向沒有關(guān)系。

附帶條件的請(qǐng)求是指采用 GET方法的請(qǐng)求報(bào)文中包含 If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。

304狀態(tài)碼或許不應(yīng)該認(rèn)為是一種錯(cuò)誤,而是對(duì)客戶端有緩存情況下服務(wù)端的一種響應(yīng)。

客戶端在請(qǐng)求一個(gè)文件的時(shí)候,發(fā)現(xiàn)自己緩存的文件有?Last Modified?,那么在請(qǐng)求中會(huì)包含?If Modified Since?,這個(gè)時(shí)間就是緩存文件的?Last Modified?。因此,如果請(qǐng)求中包含?If Modified Since,就說明已經(jīng)有緩存在客戶端。服務(wù)端只要判斷這個(gè)時(shí)間和當(dāng)前請(qǐng)求的文件的修改時(shí)間就可以確定是返回?304?還是?200?。

對(duì)于靜態(tài)文件,例如:CSS、圖片,服務(wù)器會(huì)自動(dòng)完成?Last Modified?和?If Modified Since?的比較,完成緩存或者更新。但是對(duì)于動(dòng)態(tài)頁面,就是動(dòng)態(tài)產(chǎn)生的頁面,往往沒有包含?Last Modified?信息,這樣瀏覽器、網(wǎng)關(guān)等都不會(huì)做緩存,也就是在每次請(qǐng)求的時(shí)候都完成一個(gè)?200?的請(qǐng)求。

因此,對(duì)于動(dòng)態(tài)頁面做緩存加速,首先要在?Response?的?HTTP Header?中增加?Last Modified?定義,其次根據(jù)?Request?中的?If Modified Since?和被請(qǐng)求內(nèi)容的更新時(shí)間來返回?200?或者?304?。雖然在返回?304?的時(shí)候已經(jīng)做了一次數(shù)據(jù)庫查詢,但是可以避免接下來更多的數(shù)據(jù)庫查詢,并且沒有返回頁面內(nèi)容而只是一個(gè)?HTTP Header,從而大大的降低帶寬的消耗,對(duì)于用戶的感覺也是提高。

如果用戶按下了CTRL-F5 (有時(shí)稱之為“強(qiáng)刷-hard refresh”),你會(huì)發(fā)現(xiàn)瀏覽器省略了If-Modified-Since和If-None-Match請(qǐng)求頭,也就是無條件的請(qǐng)求頁面中的每個(gè)資源.



4XX 客戶端錯(cuò)誤

4XX 的響應(yīng)結(jié)果表明客戶端是發(fā)生錯(cuò)誤的原因所在。

400 Bad Request

該狀態(tài)碼表示請(qǐng)求報(bào)文中存在語法錯(cuò)誤。當(dāng)錯(cuò)誤發(fā)生時(shí),需修改請(qǐng)求的內(nèi)容后再次發(fā)送請(qǐng)求。另外,瀏覽器會(huì)像 200 OK 一樣對(duì)待該狀態(tài)

403 Forbidden

該狀態(tài)碼表明對(duì)請(qǐng)求資源的訪問被服務(wù)器拒絕了。服務(wù)器端沒有必要給出拒絕的詳細(xì)理由,但如果想作說明的話,可以在實(shí)體的主體部分對(duì)原因進(jìn)行描述,這樣就能讓用戶看到了。未獲得文件系統(tǒng)的訪問授權(quán),訪問權(quán)限出現(xiàn)某些問題(從未授權(quán)的發(fā)送源 IP 地址試圖訪問)等列舉的情況都可能是發(fā)生 403 的原因。

404 Not Found

該狀態(tài)碼表明服務(wù)器上無法找到請(qǐng)求的資源。除此之外,也可以在服務(wù)器端拒絕請(qǐng)求且不想說明理由時(shí)使用。



5XX 服務(wù)器錯(cuò)誤

5XX 的響應(yīng)結(jié)果表明服務(wù)器本身發(fā)生錯(cuò)誤。

500 Internal Server Error

該狀態(tài)碼表明服務(wù)器端在執(zhí)行請(qǐng)求時(shí)發(fā)生了錯(cuò)誤。也有可能是 Web應(yīng)用存在的 bug 或某些臨時(shí)的故障。

503 Service Unavailable

該狀態(tài)碼表明服務(wù)器暫時(shí)處于超負(fù)載或正在進(jìn)行停機(jī)維護(hù),現(xiàn)在無法處理請(qǐng)求。如果事先得知解除以上狀況需要的時(shí)間,最好寫入RetryAfter 首部字段再返回給客戶端。狀態(tài)碼和狀況的不一致不少返回的狀態(tài)碼響應(yīng)都是錯(cuò)誤的,但是用戶可能察覺不到這點(diǎn)。比如 Web 應(yīng)用程序內(nèi)部發(fā)生錯(cuò)誤,狀態(tài)碼依然返回 200 OK,這種情況也經(jīng)常遇到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容