HTTP狀態(tài)碼及緩存控制

狀態(tài)碼

  1. 100-199:信息性狀態(tài)碼,通常和url協(xié)議相關(guān),表示接收的請求正在處理
  2. 200-299:成功狀態(tài)碼,用于表示請求正常處理完畢
  3. 300-399:重定向狀態(tài)碼,表示要么有緩存,要么做了重定向用于跳轉(zhuǎn)
  4. 400-499:客戶端錯誤狀態(tài)碼,表示服務器無法處理請求
  5. 500-599:服務器錯誤狀態(tài)碼,表示服務器處理請求出錯

其中比較常用的幾個是:200,201,204,206,301,302,303,304,403,404,500,503

  • 200 OK:表示從客戶端發(fā)來的請求在服務器端被正常處理了,一切正常,對GET和POST請求的應答文檔跟在后面。
  • 201:服務器已經(jīng)創(chuàng)建了文檔,Location頭給出了它的URL
  • 204 No Content:請求處理成功但沒有資源可返回
  • 206 Partial Content:客戶端進行了范圍請求,而服務器成功執(zhí)行了這部分的 GET 請求
  • 301 Moved Permanently:永久重定向,表示請求的資源已被分配了新的 URI,以后應使用資源現(xiàn)在所指的 URI
  • 302 Found:臨時重定向,表示資源仍然可以訪問,這個重定向只是臨時地從舊地址 A 跳轉(zhuǎn)到地址 B
  • 303 See Other:303 狀態(tài)碼和 302 Found 狀態(tài)碼有著相同的功能,但 303 狀態(tài)碼明確表示客戶端應當采用 GET 方法獲取資源

當 301、302、303 響應狀態(tài)碼返回時,幾乎所有的瀏覽器都會把 POST 改成 GET,并刪除請求報文內(nèi)的主體,之后請求會自動再次發(fā)送。
301、302 標準是禁止將 POST 方法改變成 GET 方法的,但實際使用時大家都會這么做。

  • 304 Not Modified:表示客戶端發(fā)送附帶條件的請求時,服務器端允許請求訪問資源,但未滿足條件的情況(附帶條件的請求是指采用 GET 方法的請求報文中包含 If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部),和重定向沒有關(guān)系 。
  • 403:資源不可用,服務器理解客戶端的請求但拒絕處理,一般是權(quán)限問題
  • 404:資源找不到
  • 500:未知原因突然炸了
  • 503:服務器過載炸了

http緩存控制

瀏覽器緩存控制分為強緩存和協(xié)商緩存,協(xié)商緩存必須配合強緩存使用。
首先瀏覽器第一次跟一個服務器請求一個資源,服務器在返回這個資源和response header的同時,會根據(jù)開發(fā)者要求或者瀏覽器默認,在response的header加上相關(guān)字段的http response header

瀏覽器在請求已經(jīng)訪問過的URL時,會判斷是否使用緩存,判斷是否使用緩存主要是判斷緩存是否在有效期內(nèi)。

  • 當瀏覽器對某個資源的請求命中了強緩存時,利用[Expires]或者[Cache-Control]這兩個http response header實現(xiàn)。
    • [Expires]描述的是一個絕對時間,依據(jù)的是客戶端的時間,用GMT格式的字符串表示,如Expires:Thu,31 Dec 2037 23:55:55 GMT,下次瀏覽器再次請求同一資源時,會先從客戶端緩存中查找,找到這個資源后拿出它的[Expires]與當前時間做比較,如果請求時間在[Expires]規(guī)定的有效期內(nèi)就能命中緩存,這樣就不用再次到服務器上去緩存一遍,節(jié)省了資源。但正因為是絕對時間,如果客戶端的時間被隨意篡改,這個機制就實效了,所以我們需要[Cache-Control]
    • [Cache-Control]描述的是一個相對時間,在進行緩存命中時都是利用瀏覽器時間判斷。[Expires]和[Cache-Control]這兩個header可以只啟用一個,也可以同時啟用,同時啟用時[Cache-Control]優(yōu)先級高于[Expires]
  • 當瀏覽器對某個資源的請求沒有命中強緩存(即緩存過期后),就會發(fā)起一個請求到服務器,驗證協(xié)商緩存是否命中(即驗證緩存是否有更新,雖然有效期過了,但我還能繼續(xù)使用它嗎?),如果命中則還是從客戶端中加載。協(xié)商緩存利用的是[Last-Modified,If-Modified-Since]和[ETag,If-None-Match]這兩對header來管理的
    • [Last-Modified,If-Modified-Since]:原理和上面的[Expires]相同,服務器會響應一個Last-Modified字段,表示最近一次修改緩存的時間,當緩存過期后, 瀏覽器就會把這個時間放在If-Modified-Since去請求服務器,判斷緩存是否有更新。區(qū)別是它是根據(jù)服務器時間返回的header來判斷緩存是否存在,但有時候也會出現(xiàn)服務器上資源有變化但修改時間沒有變化的情況,這種情況我們就需要[ETag,If-None-Match]
    • [ETag,If-None-Match]:原理與上面相同,區(qū)別是瀏覽器向服務器請求一個資源,服務器在返回這個資源的同時,在response的header中加上一個Etag字段,這個字段是服務器根據(jù)當前請求的資源生成的唯一標識字符串,只有資源有變化這個串就會發(fā)生改動。當緩存過期后,瀏覽器會把這個字符串放在If-None-Match去請求服務器,比較字符串的值判斷是否有更新,Etag的優(yōu)先級比Last-Modified的更高, Etag的出現(xiàn)是為了解決一個緩存文件在短時間內(nèi)被多次修改的問題,因為Last-Modified只能精確到秒。
    • [ETag,If-None-Match]這么厲害我們?yōu)槭裁催€需要[Last-Modified,If-Modified-Since]呢?有一個例子就是,分布式系統(tǒng)盡量關(guān)掉ETag,因為每臺機器生成的ETag不一樣,[Last-Modified,If-Modified-Since]和[ETag,If-None-Match]一般都是同時啟用。

參考資料

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

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)絡特有的延遲以及數(shù)據(jù)傳輸?shù)某杀荆萍s互聯(lián)網(wǎng)快速獲取Web資源。為此,HTTP協(xié)議引入緩存以空間換時間,使瀏覽器緩...
    大頭8086閱讀 3,199評論 2 12
  • 本文內(nèi)容大多參考《圖解HTTP》一書 一. 認識代理服務器 所以講緩存為什么要先扯代理服務器?別急,讓我們看一下一...
    流光號船長閱讀 2,102評論 0 10
  • 轉(zhuǎn)載:瀏覽器緩存知識小結(jié)及應用 閱讀目錄 1. 瀏覽器緩存基本認識 2. 強緩存的原理 3. 強緩存的管理 4. ...
    meng_philip123閱讀 1,169評論 4 18
  • 瀏覽器緩存,也就是客戶端緩存,既是網(wǎng)頁性能優(yōu)化里面靜態(tài)資源相關(guān)優(yōu)化的一大利器,也是無數(shù)web開發(fā)人員在工作過程不可...
    單純的土豆閱讀 436評論 0 1
  • 瀏覽器緩存,也就是客戶端緩存,既是網(wǎng)頁性能優(yōu)化里面靜態(tài)資源相關(guān)優(yōu)化的一大利器,也是無數(shù)web開發(fā)人員在工作過程不可...
    Www劉閱讀 607評論 0 1

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