狀態(tài)碼
- 100-199:信息性狀態(tài)碼,通常和url協(xié)議相關(guān),表示接收的請求正在處理
- 200-299:成功狀態(tài)碼,用于表示請求正常處理完畢
- 300-399:重定向狀態(tài)碼,表示要么有緩存,要么做了重定向用于跳轉(zhuǎn)
- 400-499:客戶端錯誤狀態(tài)碼,表示服務器無法處理請求
- 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]一般都是同時啟用。
參考資料:
- 簡述瀏覽器緩存是如何控制的評論區(qū):馬里奧,吳晗君。