1. 程式人生 > >HTTP 協議中快取處理機制(Expires、Last-Modified、ETag

HTTP 協議中快取處理機制(Expires、Last-Modified、ETag

應用場景

瞭解 HTTP(我們這裡說的是 HTTP/1.1) 協議中快取的處理機制,會對網站優化有些許幫助,例如會應用到:加速網站的載入,伺服器端與瀏覽器檔案及時同步。

瀏覽器請求 URL 時,根據 HTTP 協議的規定,瀏覽器與伺服器會通過報頭(HTTP Request HeaderHTTP Reponse Header)進行交流,並根據其協議中和快取的相關欄位(Expires、Last-Modified、ETag)進行處理快取。引數示例如下:

  • Expires: 12:07:08 Monday, May 20, 2013 GMT
  • Last Modification: 03:21:32 Wednesday, November 21, 2012 GMT
  • Last Cache Update: 12:07:08 Wednesday, November 21, 2012 GMT
  • Last Access: 14:33:07 Tuesday, November 27, 2012
  • ETag: “3511605509″

快取處理流程

1.瀏覽器第一次請求 URL,若此資源正常伺服器將返回狀態 200,並獲取儲存與快取相關的屬性,用於以後的請求:

  • Expires: 記錄超時時間,即檔案到了這個記錄的時間點,就不能再用瀏覽器的對應此 URL 的快取了,該去伺服器上拿了。
  • Last Modification: 伺服器中,此 URL 對應檔案在伺服器的最近更新時間。
  • ETag:
     “被請求變數的實體標記”,可以理解為伺服器中此 URL 對應檔案的唯一識別符號。

2.瀏覽器第二次請求 URL,首先將比較 Expires 的時間與當前請求時間,若未超時,則直接讀取快取,不與伺服器互動。

3.若比較 Expires 發現已超時或快取失效時,瀏覽器將請求 URL。同時帶了屬性,用於檢測檔案是否更新:

  • If-None-Match: 值為第一次請求的 ETag。
  • If-Modified-Since: 值為第一次請求的 Last-Modification。

4.若 If-None-Match 值(即 ETag)未改變,且 If-Modified-Since 該時間之後檔案未被修改過,則伺服器僅返回狀態 304,意思就是,不用更新,從快取中拿吧~ 這樣做的好處是,不用重複傳輸檔案內容了,提高了載入速度又確定了檔案與伺服器一致,另外,也重新計算 Expires 的值(若超時時間為 24h,則 Expires 值重新整理為此請求時間的一天後)。

5.若 If-None-Match 值改變,或比較 If-Modified-Since 時間發現檔案被修改,則檔案已更新,伺服器將重新發出資源,返回和第一次請求流程類似。

流程結束。這樣的流程好處是:既保證不向瀏覽器重複傳送同一資源,有保證了當伺服器 URL 對應資源有更新時,客戶端能夠同步到最新的資源。

應用例項

在實際的網站開發中,線上環境通常會有出現 CSS、JS 更新,若伺服器端已更新,而瀏覽器還是在使用快取而不同步,將出現頁面展示或 JS 異常等問題,為了保證瀏覽器能及時同步資源,我們可以這樣做:

將 Expires 設定為 -1,意思是立即超時,則每次載入資源都會請求 URL,通過 Last Modification 和 ETag 來由伺服器來判斷是否更新。這樣就保證了伺服器與瀏覽器資原始檔同步。

上面的方法雖然同步了,但是也使所有資原始檔每次都將訪問伺服器,而建立連線,本來就會有時間損耗,所以改進如下:

將 Expires 設為一年或者更長 ,則瀏覽器不會主動請求 URL。但在 URL 後面加上類似時間戳的引數,例如 “website/css/index.css?tm=2012112730.css”,後面跟的引數其實是沒有實際意義的,但是,每次在我們需要客戶端同步對應檔案時,僅需要修改對應檔案 URL 的 tm 引數即可,瀏覽器發現 URL 為新 URL,將即刻更新。

百度、淘寶等對 JS、CSS快取處理用的基本都是上面的策略,這樣做的好處是:瀏覽器預設任何時候都僅使用快取,加快了載入。而當檔案需要更新時,通過修改引數又能讓瀏覽器及時更新。

總結

瞭解協議對優化和規範網站開發有不少幫助,上面提到的屬性和應用場景容易被開發者疏忽,在現在這種網際網路開發迭代速度極快的節奏下,上面的問題就會更加容易暴露,規範處理好了會省心很多。

本文提到的屬性和應用場景是協議和網站開發的一小部分,拋磚引玉,歡迎糾錯

相關推薦

HTTP 協議快取處理機制ExpiresLast-ModifiedETag

應用場景 瞭解 HTTP(我們這裡說的是 HTTP/1.1) 協議中快取的處理機制,會對網站優化有些許幫助,例如會應用到:加速網站的載入,伺服器端與瀏覽器檔案及時同步。 瀏覽器請求 URL 時,根據 HTTP 協議的規定,瀏覽器與伺服器會通過報頭(HTTP Request Header、HTTP Repon

005-優化web請求一-gzip壓縮http緩存控制和緩存校驗[PragmaExpiresCache-Controlmax-ageLast-Modified用戶刷新訪問避免過度304]

無法 新鮮度 開發者模式 請求報文 XML 自定義 server clas 存在   優化Web應用的典型技術:緩存控制頭信息、Gzip、應用緩存、ETag、反應型技術【異步方法調用和WebSocket】 一、模板緩存 spring.thymeleaf.cache=

Qt的事件處理機制event)

Qt事件也就是Qt程式中出現的一系列“事情”,包括對使用者操作做出反應時發出的滑鼠或鍵盤事件等;以及系統內部自動發出的定時器事件等。總之,出現了這些事件後就需要對這些事件進行處理,處理的方法便是“事件處理機制”。 圖1 Qt事件產生 以

淺談Linux的訊號處理機制三)

       一晃眼,已經到9月底了,都來不及去感慨時間匆匆。最近常常會想明年的今天我將會在那裡幹著什麼樣的工作?對未來又是憧憬又是擔憂,壓力山大。無論如何現在還是踏踏實實的學習吧,能這樣安安靜靜學習的日子也不多了。不扯了,還是接著前面的寫吧。 SA_RESTART語義        在上篇提到過,SA_

淺談Linux的訊號處理機制二)

      首先謝謝 @小堯弟 這位朋友對我昨天夜裡寫的一篇《淺談Linux中的訊號處理機制(一)》的指正,之前的題目我用的“淺析”一詞,給人一種要剖析核心的感覺。本人自知功力不夠,尚且不能對著Linux核心原始碼評頭論足。以後的路還很長,我還是一步一個腳印的慢慢走著吧,Linux核心這座山,我才剛剛抵達山腳

淺談Linux的訊號處理機制一)

     有好些日子沒有寫部落格了,自己想想還是不要荒廢了時間,寫點兒東西記錄自己的成長還是百利無一害的。今天是9月17號,暑假在某家遊戲公司實習了一段時間,做的事情是在Windows上用c++寫一些遊戲英雄技能的邏輯實現。雖然時間不算長,但是也算學了一點東西,對團隊專案開發流程也有了一個直觀的感受,專案裡c

Spring mvc HTTP協議快取機制

概述 Spring MVC 支援HTTP協議的 Last-Modified 快取機制。 在客戶端地一次輸入URL時,伺服器端會返回內容和狀態碼200, 表示請求成功,同時會新增一個“Last-Modified”屬性,表示該請求資源的最後修改時間 客戶端第二次請求此URL時,客戶端會向伺服器傳送請求頭 “IF-

HTTP協議2)HTTP協議的請求資訊

1:請求行   請求行分為三部分: 請求方式:GET、POST 資源路徑:/servlet/request http協議版本:http/1.1HTTP/0.9 :只接受GET一種請求方法,沒有在通訊中指定版本號,且不支援請求頭。由於該版本不支援POST方法,因此客戶端無法向

【網路】HTTP協議的長連線和短連線keep-alive狀態)

 HTTP1.1規定了預設保持長連線(HTTP persistent connection ,也有翻譯為持久連線),資料傳輸完成了保持TCP連線不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸資料;相反的就是短連線。  HTTP首部的Connection: Keep-alive是HT

從零開始理解JAVA事件處理機制2)

extend nds 接下來 htm ref param 簡單 tostring ansi 第一節中的示例過於簡單《從零開始理解JAVA事件處理機制(1)》,簡單到讓大家覺得這樣的代碼簡直毫無用處。但是沒辦法,我們要繼續寫這毫無用處的代碼,然後引出下一階段真正有益的代碼。

Java的反射機制一)

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

斐迅面試記錄—Http協議的Header

art apple -c etag cookie md5 頭信息 一點 zip HTTP Request的Header信息 1、HTTP請求方式 如下表: 說明: 主要使用到“GET”和“POST”。 實例: POST /test/tupian/cm HTTP/1.1

HTTP協議的通用頭及其功能

通用頭一、Connection指示客戶端與服務器在進行HTTP通信時如何處理TCP連接,如果Connection的值為close,則表示本次HTTP請求響應後結束TCP連接;如果Connection的值為Keep-Alive(HTTP1.1下為默認),則表示TCP連接一直有效二、DateDate通用頭域表明消

http協議get和post的區別

httpHttp定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETEURL全稱是資源描述符,我們可以這樣認 為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查 ,改 ,增 ,刪 4個操作。到這裏,

HTTP協議狀態碼詳解HTTP Status Code)

找不到 work for 條件 暫時 ocs 有效 網絡設備 不同 使用ASP.NET/PHP/JSP 或者javascript都會用到http的不同狀態,一些常見的狀態碼為: 200 – 服務器成功返回網頁 404 – 請求的網頁不存在 503 – 服務不可用 1x

005_關於HTTP協議的保持連接

註意 o-c 一段 apach user 一段時間 enc 關閉連接 1.5 緣起 中午在群裏討論,用ab測試 一臺只提供靜態文件服務, 不與其他任何系統交互的時候,為什麽也會產生大量的TIME WAIT狀態的。 首先,我們可以簡單的理解,在TCP連接的兩端,誰主動斷開連接

java異常處理機制 throw拋出自定義業務邏輯異常 throws繼續拋出 catch捕獲後會自動繼續拋向調用方法

異常處理機制 ... cep super finally sta exc ace 避免 package com.swift; public class Exception_TestC { public static void main(String[] arg

HTTP 協議 URI 和 URL 有什麽區別?

路徑 西湖區 AI www. str 我們 tar ofo 不能 URI = Universal Resource IdentifierURL = Universal Resource Locator 統一資源標誌符URI就是在某一規則下能把一個資源獨一無二地標識出來。拿

HTTP協議request報文請求方法和狀態響應碼

cti keep lang one com location 部分 AC url   一個HTTP請求報文由4部分組成: 請求行(request line) 請求頭部(header) 空行 請求數據   下圖給出了請求報文的一般格式:

深入理解Java異常處理機制 籠統篇)

throw 種類型 綜合 IV 算術 其它 wid all 作用 開篇 1.異常處理(Exception Handling):   就是一種解決這一問題的機制,能夠較好地處理程序不能正常運行的情況。 2.異常(Exception):   是程序在運行時可能出現的