Http靜態資源的緩存

最近一段時間一直在研究頁面緩存和壓縮方面的東西,因爲公司服務器使用的是iis6.0,不少性能方面的優化都不支持。因此,就開始嘗試着本身寫個簡單的處理程序。css

爲了減小服務器帶寬的需求,咱們要減小客戶端與服務器端交互的數據量。解決方法以下:
1. 緩存不多變化的靜態資源,好比JS,CSS和圖片。
2. 對網絡交互的數據進行壓縮,好比對JS,CSS,HTML,圖片等。
3. 減小客戶端與服務器端的交互次數,咱們能夠合併全部的JS文件,合併全部的CSS文件。
緩存位於服務器之間和客戶端之間,根據請求保存輸出內容的副本,如html頁面,圖片,文件,當下一個請求來到時,若是相同的URL,直接使用副本響應訪問請求,而不向源服務器再次發送請求。html

如下整理了一些Http請求頭相關的知識:node

緩存的類型
1. 瀏覽器緩存
瀏覽器都有關於緩存的設置。經過在電腦硬盤存儲已經看過的網站的副本。
2. 代理服務器緩存
Web代理服務器使用一樣的緩存原理,代理服務器羣爲成百上千用戶服務使用一樣的機制;代理服務器緩存是共享緩存,爲大量用戶使用,所以在減小相應時間和帶寬使用方面頗有效,同一個副本會被重用屢次。
3. 網關緩存
也稱爲反向代理緩存或間接代理緩存,網關緩存也是一箇中間服務器,和內網管理員部署緩存用於節省帶寬不一樣,網關緩存通常是網站管理 員本身部署,讓他們的網站更容易擴展並得到更好的性能。請求有幾種方法被路由到網關緩存服務器上,其中典型的是讓用一臺或多臺負載均衡服務器從客戶端看上 去是源服務器。

緩存如何工做
1. 若是響應頭信息:告訴緩存器不要保留緩存,緩存器就不會緩存相應內容。
2. 若是請求信息是須要認證或者安全加密的,相應內容默認不會被緩存。
3.若是在迴應中不存在校驗器(ETag或者Last-Modified頭信息),緩存服務器會認爲缺少直接的更新度信息,內容將會被認爲不可緩存。
4. 一個緩存的副本若是含有如下信息,內容將會被認爲是足夠新的。apache

  • 含有完整的過時時間和壽命控制頭信息,而且內容仍在保鮮期內。
  • 瀏覽器已經使用過緩存副本,而且在一個會話中已經檢查過內容的新鮮度。
  • 緩存代理服務器近期內已經使用過緩存副本,而且內容的最後更新時間在上次使用期以前

5.若是緩存的副本已經太舊了,緩存服務器將向源服務器發出請求校驗請求,用於肯定是否能夠繼續使用當前拷貝繼續服務。

四種經常使用於控制客戶端緩存的頭標
1. Last-Modified 最後修改時間
這個頭標是一個響應頭標,表示客戶端(一般指瀏覽器)所請求資源在服務器端的最後修改時間,一般狀況下客戶端在接受這個頭標後,在之後對這個資源的請求會附 帶一個’If-Modified-Since’請求頭標,而這個頭標是想告訴服務器上次客戶端所請求資源的最後修改時間,對於一些圖像,css,js等靜 態文件資源,配置好了的apache服務器會理解這些If-Modified-Since請求頭標,將頭標裏的時間和文件的最後修改時間進行比較並做出響 應,若是兩者相等則發送一個304 Not Modfied來告訴客戶端所請求資源並未修改讓客戶端放心使用緩存中的資源,不然的話會從新發送一個新的資源和新的Last-Modified的頭標。
2. ETag(Entity Tag) 實體標籤
和Last-Modified相似,也是WEB服務器和客戶端用於確認緩存組件的有效性的一種 機制,apache 1.3和2.0的ETag格式是inode-size-timestamp,所以當資源被修改,其ETag也發生改變,ETag相對Last- Modified更精確,Last-Modified只能精確的s級別,可是ETag在多服務器可能形成混亂
3. Expires 過時時間
這個屬性告訴緩存器相關副本在多長時間內是新鮮的。過了這個時間,緩存器就會向源服務器發送請求,檢查文檔是否被 修改。幾乎全部的緩存服務器都支持Expires屬性。能夠設計一個絕對時間間隔:基於客戶最後查看副本的時間(最後訪問時間)或者根據服務器上文檔最後 被修改的時間。Expires頭信息對於設置靜態圖片緩存特別有用,這些圖片修改不多,能夠給它們設置一個特別長的過時時間,這會使網站對用戶變得相應很是快。 4. Cache-Control 緩存控制
讓網站的發佈者控制他們的內容,並定位過時時間的限制。好比:Cache-Control: max-age=3600, public,可選項以下:瀏覽器

  • max-age =[秒] 執行緩存的最長時間,[秒]是一個數字,單位是秒:從請求時間開始到過時時間之間的秒數。
  • s-maxage =[秒] 相似於max-age屬性,除了他應用於共享(如:代理服務器)緩存
  • public 標記認證內容也能夠被緩存,通常來講: 通過HTTP認證才能訪問的內容,輸出是自動不能夠緩存的;
  • no-cache強制每次請求直接發送給源服務器,而不通過本地緩存版本的校驗。這對於須要確認認證應用頗有用(能夠和public結合使用),或者嚴格要求使用最新數據的應用(不惜犧牲使用緩存的全部好處);
  • no-store 強制緩存在任何狀況下都不要保留任何副本
  • must-revalidate告訴緩存必須遵循全部你給予副本的新鮮度的,HTTP容許緩存在某些特定狀況下返回過時數據,指定了這個屬性,高速緩存,但願嚴格的遵循你的規則。
  • proxy-revalidate 和 must-revalidate相似,除了他只對緩存代理服務器起做用
相關文章
相關標籤/搜索