瀏覽器快取策略

Aaron_2016發表於2019-04-06

瀏覽器快取策略

為了提高站點的訪問速度,使用快取來優化。快取主要分為 強快取和協商快取。

協商快取

主要分為last-modified、etag。下面我主要通過程式碼修改來表現各個快取之間的區別。先討論協商快取。last-modified表示檔案的修改日期,如果檔案做了修改那就應該重新獲取檔案。last-modified是檔案修改後根據伺服器的時間生成。

no-store

如果我們修改了檔案則會重新獲取,status就為200

修改檔案

再次重新整理就會返回304表示快取已經是最新不需要再更新。 請求中會詢問相關檔案修改時間(If-Modified-Since)

請求

瀏覽器快取策略

響應

瀏覽器快取策略

**ETag:**是一個可以與Web資源關聯的記號(token)

如果檔案被替換,就會生成唯一的etag。

替換前的檔案

瀏覽器快取策略

替換後的檔案

瀏覽器快取策略

PS: 如果是使用了多臺伺服器做負載均衡的話,會出現etag不一致問題。Apache 的預設ETag的值總是由檔案的索引節點(Inode)、大小(Size)、最後修改時間(MTime)決定,我們只需要去掉Inode即可

強快取

強快取相比協商快取更為徹底,在協商快取下瀏覽器不會對伺服器發起請求。

**強快取:**主要分為expires和cache-control

Expires: 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求),等同max-age的 效果。但是如果同時存在,則被Cache-Control的max-age覆蓋。 格式: Expires :時間,後面跟一個時間或者日期,超過這個時間後快取失效。也就是瀏覽器發出請求之前,會檢查這個時間是否失效,若失效,則瀏覽器會重新發出請求。

開啟apache expires_mod之後,瀏覽器在第一次將資源請求之後會快取。

瀏覽器快取策略

Cache-Control Cache-Control 在 HTTP 響應頭中,用於指示代理和 UA 使用何種快取策略。比如:

  • no-cache 為本次響應不可直接用於後續請求(在沒有向伺服器進行校驗的情況下)
  • no-store 為禁止快取(不得儲存到非易失性介質,如果有的話儘量移除,用於敏感資訊)
  • public為大家都可以快取。
  • private為僅 UA 可快取

cache-control中設定max-age 為最長的快取時間。在該時間內則使用快取。

瀏覽器快取策略

設定為no-cache之後則不會再進行快取。

瀏覽器快取策略

題外話

在使用apache對瀏覽器快取進行測試過程中發現。在不設定 cache-control的情況下,瀏覽器會根據自身的情況去取捨相關的快取,可以從這檢視。如果大家在伺服器配置過程中發現,自己沒有配置任何的快取資訊但是瀏覽器卻快取了資源就不用驚訝。

相關文章