聊一聊HTTP緩存機制

前言

  • 在說緩存以前先簡單說一下HTTP報文。HTTP報文是在HTTP應用程序之間發送的數據塊。報文的結構由起始行、頭部(header)和主體(body)組成。報文的類型又有請求報文和響應報文。

緩存

  • 當瀏覽器第一次向服務器請求資源時會去詢問服務器這個資源該不應緩存,用什麼方法緩存。假設服務器贊成瀏覽器緩存,並告訴瀏覽器一個資源失效時間,這個時間存放在Expires中如:Mon,10 Dec 1990 02:25:22GMT。那麼這個資源在這個時間以前都能使用。那麼有一個問題是:客戶端的時間是能夠被修改的,並且客戶端和服務器時間未必一致。
  • 既然返回一個絕對時間很差用,那麼服務器就返回一個相對時間好了,這個時間在Cache-Control:max-age=300單位是秒(s)。如今好了300秒內這個資源就不會過時。那麼有一種多是300秒後我再次去服務器拿這個資源發現資源並無被改變過,服務器又再次返回了一樣的資源給我,這樣的話就浪費了一次帶寬。其實能夠返回一條信息給瀏覽器代表緩存資源能夠繼續使用。
  • 如今回到瀏覽器第一次請求的時候,服務器響應頭中多了一個ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"。這個ETag是服務器根據資源計算出的惟一標識,一般配合max-age使用。當時間過時之後瀏覽器會將標識放在請求頭中的If-None-Match,服務器收到請求之後會拿請求中的標識與服務器根據資源計算的Etag進行比較,若一致則返回響應頭其中包含狀態碼304。不一致就返回新的資源。可是在分佈式系統中每一個機器生成的ETag不同。
  • 既然ETag也不是那麼的靠譜,那麼服務器第一次返回時在響應頭中又加了一個字段Last-Modified。當資源過時時瀏覽器發現資源有Last-Modified,而後發請求時便在請求頭增長了一個字段If-Modified-Since表示發送的請求時間,服務器拿到這個時間與資源的最後修改時間比較,若是修改時間比較新那麼返回新的資源,不然返回Http 304。

補充

1.當ExpiresCache-Control:max-age同時存在時max-age的優先級高。
2.[Last-Modified,If-Modified-Since]和[ETag、If-None-Match]常常會放在一塊兒使用。瀏覽器

相關文章
相關標籤/搜索