HTTP狀態碼304與ETag詳解

狀態碼304
相關頭信息

Last-Modified:響應頭,表示當前資源的最後修改時間;
If-Modified-Since:請求頭,表示緩存的資源最後修改時間;
狀態碼304:表示訪問的資源沒有改變

客戶端首次訪問服務器的靜態資源index.html,服務器會把index.html響應給客戶端,而且還會添加一個名爲Last-Modified的響應頭,它說明了當前index.html的最後修改時間
客戶端收到響應後,會把index.html緩存在客戶端上,而且還會把Last-Modified緩存起來。
客戶端第二次請求index.html時,會添加名爲If-Modified-Since的請求頭,它的值是上次服務器響應頭Last-Modified,服務器獲取到客戶端保存的最後修改時間,以及當前資源的最後修改時間進行比較,如果相同,說明index.html沒有改動過,那麼服務器不會發送index.html,而是響應狀態碼304,即通知客戶端資源沒有改變,你可以使用自己的緩存。
ETag 是 Entity Tag(實體標籤)的縮寫
在HTTP1.1協議中其實就是請求HEAD中的一個屬性

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
1
2
3
4
5
6
7
8
9
10
ETag是HTTP1.1中才加入的一個屬性,用來幫助服務器控制Web端的緩存驗證。

它的原理是這樣的,當瀏覽器請求服務器的某項資源(A)時, 服務器根據A算出一個哈希值(3f80f-1b6-3e1cb03b)並通過 ETag 返回給瀏覽器,瀏覽器把"3f80f-1b6-3e1cb03b" 和 A 同時緩存在本地,當下次再次向服務器請求A時,會通過類似 If-None-Match: “3f80f-1b6-3e1cb03b” 的請求頭把ETag發送給服務器,服務器再次計算A的哈希值並和瀏覽器返回的值做比較,如果發現A發生了變化就把A返回給瀏覽器(200),如果發現A沒有變化就給瀏覽器返回一個304未修改。

這樣通過控制瀏覽器端的緩存,可以節省服務器的帶寬,因爲服務器不需要每次都把全量數據返回給客戶端。

通常情況下,ETag更類似於資源指紋(fingerprints),如果資源發生變化了就會生成一個新的指紋,這樣可以快速的比較資源的變化。在服務器端實現中,很多情況下並不會用哈希來計算ETag,這會嚴重浪費服務器端資源,很多網站默認是禁用ETag的。有些情況下,可以把ETag退化,比如通過資源的版本或者修改時間來生成ETag。

如果通過資源修改時間來生成ETag,那麼效果和HTTP協議裏面的另外一個控制屬性(Last-Modified)就雷同了,使用 Last-Modified 的問題在於它的精度在秒(s)的級別,比較適合不太敏感的靜態資源。
————————————————
版權聲明:本文爲CSDN博主「leo_neverGiveUp」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43915587/article/details/95499873

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章