1. 程式人生 > >瀏覽器快取機制和自己的一點疑問

瀏覽器快取機制和自己的一點疑問

web快取:

           web快取有很多種,在服務端有資料庫快取、CDN(主要是快取圖片、檔案等靜態資源)、代理伺服器快取等。

          在瀏覽器中,快取是將檔案儲存在客戶端,在同一個會話過程中會檢查快取的副本是否足夠新,在後退網頁時,訪問過的資源可以從瀏覽器快取中拿出使用。通過減少伺服器處理請求的數量,使用者將獲得更快的體驗。同時減少網路頻寬。

快取協商
        現在我們需要將使用者的瀏覽器也納入我們構建網站各個快取層次中的其中一個重要層次,網站資訊和內容在由web伺服器生成,而將這些資訊和內容作為一段二進位制的檔案作為本地快取檔案存放在使用者的瀏覽器,是兩個獨立個體共同完成的任務,所以兩者之間需要一種溝通的機制,也就是HTTP的快取協商。


 瀏覽器快取:

          快取狀態是由http訊息的header中的引數決定的。

一 、Cache-control

            其中常用的欄位有:

           1  、max-age(單位為s)指定設定快取最大的有效時間,定義的是時間長短。當瀏覽器向伺服器傳送請求後,在max-age這段時間裡瀏覽器就不會向伺服器發請求了,在這段時間內。即使伺服器上的資源發生了變化,瀏覽器也不會得到通知。max-age會覆蓋掉Expires。

           2、s-maxage(單位為s)max-age用於普通快取,而s-maxage用於代理快取。如果存在s-maxage,則會覆蓋掉max-age和Expires header。   

           3、public:指定響應會被快取,並且在多使用者間共享。未指定public和private時,預設是public

           4、private:響應只作為私有的快取,不能在使用者間共享。如果要求HTTP認證,響應會自動設定為private。

           5、no-store:絕對禁止快取,一看就知道如果用了這個命令當然就是不會進行快取啦~每次請求資源都要從伺服器重新獲取。


二、 Expires

          用來指定資源到期的時間,是一個絕對時間。在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器快取取資料,而無需再次請求。需要和Last-modified結合使用

Expires 的一個缺點就是,返回的到期時間是伺服器端的時間,這樣存在一個問題,如果客戶端的時間與伺服器的時間相差很大(比如時鐘不同步,或者跨時區)ExpiresHTTP 1.0的東西,現在預設瀏覽器均預設使用HTTP 1.1,所以它的作用基本忽略。

三、Last-Modified/If-Modified-Since

          伺服器端檔案的最後修改時間,需要和cache-control共同使用。當瀏覽器再次進行請求時,會向伺服器傳送If-Modified-Since報頭,詢問Last-Modified時間點之後資源是否被修改過。如果沒有修改,則返回碼為304,使用快取;如果修改過,則再次去伺服器請求資源,返回碼和首次請求相同為200,資源為伺服器最新資源。如果沒有修改,則返回碼為304,使用快取;如果修改過,則再次去伺服器請求資源,返回碼和首次請求相同為200,資源為伺服器最新資源。

四、Etag/If-None-Match

           根據實體內容生成一段hash字串,標識資源的狀態,由服務端產生。瀏覽器會將這串字串傳回伺服器,驗證資源是否已經修改,如果沒修改則使用快取。也要結合Cach-control使用。當資源過期時(使用Cache-Control標識的max-age,發現資源具有Etage宣告,則再次向web伺服器請求時帶上頭If-None-MatchEtag的值)web伺服器收到請求後發現有頭If-None-Match則與被請求資源的相應校驗串進行比對,決定返回200304

其他:

       ① Etag和Last-Modifed優先順序的問題:

       A:如果某些檔案會被定期生成,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致檔案沒法使用快取

       B:如果資源修改非常頻繁,在秒以下的時間內進行修改,而Last-modified只能精確到秒

       C:某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新

       ② Last-Modified和Etag與Cach-Control如何結合使用?(本人疑惑的點:

         要從一張廣為流傳的圖說起,我的疑問是:

      1:既然cache-control中的max-age會覆蓋Expires(是否過期),那第一步判斷是否過期這樣畫就不嚴謹。

      2:Last-Modified、Etag 和Cach——control怎麼結合使用?有Etag、有Last-Modified就會向伺服器傳送訊息。之前驗證max-age只是個相對時間,瀏覽器會有計時器自動檢查這個時間?不需要伺服器發包時間來對比這個相對時間?

使用者行為與快取:

參考:

瀏覽器快取機制(吳秦)

淺談web快取(AlloyTeam)

瀏覽器 HTTP 協議快取機制詳解