瀏覽器快取策略
為了提高站點的訪問速度,使用快取來優化。快取主要分為 強快取和協商快取。
協商快取
主要分為last-modified、etag。下面我主要通過程式碼修改來表現各個快取之間的區別。先討論協商快取。last-modified表示檔案的修改日期,如果檔案做了修改那就應該重新獲取檔案。last-modified是檔案修改後根據伺服器的時間生成。
如果我們修改了檔案則會重新獲取,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的情況下,瀏覽器會根據自身的情況去取捨相關的快取,可以從這檢視。如果大家在伺服器配置過程中發現,自己沒有配置任何的快取資訊但是瀏覽器卻快取了資源就不用驚訝。