浏览器缓存机制,强缓存,弱缓存
目錄
- web緩存類型
- 瀏覽器緩存規則:
- 瀏覽器緩存的控制
- cache-control總結
- Expires
- Last-modified & If-modified-since
- Etag & & If-None-Match
- 瀏覽器緩存流程
- 為什么要有etag?
- 哪些請求不能被緩存?
- 用戶操作行為與緩存的關系
- HTTP狀態碼及區別
web緩存類型
下面著重關注一下瀏覽器緩存
瀏覽器緩存規則:
- 含有完整的過期時間控制頭信息(HTTP協議報頭),并且仍在有效期內
- 瀏覽器已經使用過這個緩存副本,并且在一個會話中已經檢查過新鮮度
瀏覽器緩存的控制
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
cache-control總結
cache-control: max-age
max-age(單位為s)指定設置緩存最大的有效時間,定義的是時間長短。當瀏覽器向服務器發送請求后,在max-age這段時間里瀏覽器就不會再向服務器發送請求了。我們來找個資源看下。比如QQ推廣上的css資源,max-age=3600,也就是說緩存有效期為3600秒(也就是1h)。于是在1天內都會使用這個版本的資源,即使服務器上的資源發生了變化,瀏覽器也不會得到通知。
cache-control: max-age=xxxx,public
客戶端和代理服務器都可以緩存該資源;
客戶端在xxx秒的有效期內,如果有請求該資源的需求的話就直接讀取緩存,statu code:200 ,如果用戶做了刷新操作,就向服務器發起http請求
cache-control: max-age=xxxx,private
只讓客戶端可以緩存該資源;代理服務器不緩存
客戶端在xxx秒內直接讀取緩存,statu code:200
cache-control: max-age=xxxx,immutable
客戶端在xxx秒的有效期內,如果有請求該資源的需求的話就直接讀取緩存,statu code:200 ,即使用戶做了刷新操作,也不向服務器發起http請求
cache-control: no-cache
跳過設置強緩存,但是不妨礙設置協商緩存;一般如果你做了強緩存,只有在強緩存失效了才走協商緩存的,設置了no-cache就不會走強緩存了,每次請求都回詢問服務端。
cache-control: no-store
不緩存,這個會讓客戶端、服務器都不緩存,也就沒有所謂的強緩存、協商緩存了。
Expires
緩存過期時間,用來指定資源到期的時間,是服務器端的具體的時間點。也就是說, Expires=max-age + 請求時間 ,需要和Last-modified結合使用。但cache-control的優先級更高。Expires是Web服務器響應消息頭字段,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。
Last-modified & If-modified-since
服務器端文件的最后修改時間,需要和cache-control共同使用,是檢查服務器端資源是否更新的一種方式。當瀏覽器再次進行請求時,會向服務器傳送If-Modified-Since報頭,詢問Last-Modified時間點之后資源是否被修改過。如果沒有修改,則返回碼為304,使用緩存;如果修改過,則再次去服務器請求資源,返回碼和首次請求相同為200,資源為服務器最新資源。
Etag & & If-None-Match
根據實體內容生成一段hash字符串,標識資源的狀態,由服務端產生。瀏覽器會將這串字符串傳回服務器,驗證資源是否已經修改,如果沒有修改,則返回304
瀏覽器緩存流程
為什么要有etag?
你可能會覺得使用 Last-Modified 已經足以讓瀏覽器知道本地的緩存副本是否足夠新,為什么還需要 Etag(實體標識)呢?HTTP1.1中Etag的出現主要是為了解決幾個 Last-Modified 比較難解決的問題:
-
Last-Modified 標注的最后修改只能精確到秒級,如果某些文件在1秒鐘以內,被修改多次的話,它將不能準確標注文件的新鮮度
-
如果某些文件會被定期生成,當有時內容并沒有任何變化,但 Last-Modified 卻改變了,導致文件沒法使用緩存
-
有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形
Etag是服務器自動生成或者由開發者生成的對應資源在服務器端的唯一標識符,能夠更加準確的控制緩存。Last-Modified與ETag是可以一起使用的,服務器會優先驗證ETag,一致的情況下,才會繼續比對Last-Modified,最后才決定是否返回304。
哪些請求不能被緩存?
無法被瀏覽器緩存的請求:
用戶操作行為與緩存的關系
- 普通刷新 – 當按下F5或者點擊刷新按鈕來刷新頁面的時候,瀏覽器將繞過本地緩存來發送請求到服務器, 此時, 協商緩存是有效的
- 強制刷新 – 當按下ctrl+F5來刷新頁面的時候, 瀏覽器將繞過各種緩存(本地緩存和協商緩存), 直接讓服務器返回最新的資源
- 回車或轉向 – 當在地址欄上輸入回車或者按下跳轉按鈕的時候, 所有緩存都生效
HTTP狀態碼及區別
| 200 | form memory cache | 不請求網絡資源,資源在內存當中,一般腳本、字體、圖片會存在內存當中 |
| 200 | form disk cache | 不請求網絡資源,在磁盤當中,一般非腳本會存在內存當中,如css等 |
| 200 | 資源大小數值 | 從服務器下載最新資源 |
| 304 | 報文大小 | 請求服務端發現資源沒更新,使用本地資源 |
總結
以上是生活随笔為你收集整理的浏览器缓存机制,强缓存,弱缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机房收费管理系统之退卡
- 下一篇: 前端技能图谱笔记