[CDN 技術] HTTP參數中Etag的重要性


Etag在HTTP1.1中有介紹,主要的作用就是在(css file, image, javascript file)文件后面添加一個唯一的參數(相當於查詢參數字符串),Etag有服務器端生成,並且隨着文件的改變而改變,這樣瀏覽器端就會只重新請求獲取 Etag發生變化的文件,減少瀏覽器端數據的流量,加快瀏覽器的反應速度,重要的是減輕服務器端的壓力,所以服務器端Etag的實現就比較重要了.

現在我們有個問題為什么要使用Etag呢?

Etag主要為了解決Last-Modified無法解決的一些問題.他能比Last_Modified更加精確的知道文件是否被修改過.如果有個 文件修改非常頻繁,比如在秒以下的時間內進行修改,比如1秒內修改了10次,If-Modified-Since能檢查只能秒級的修改,所以這種修改無法 判斷.原因是UNIX記錄MTIME只能精確到秒.所以我們選擇生成Etag,因為Etag可以綜合Inode,MTime和Size,可以避免這個問 題.

Etag的工作原理
Etag在服務器上生成后,客戶端通過If-Match或者說If-None-Match這個條件判斷請求來驗證資源是否修改.我們常見的是使用If-None-Match.請求一個文件的流程可能如下:
新的請求
客戶端發起HTTP GET請求一個文件(css ,image,js);服務器處理請求,返回文件內容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http頭狀態碼為為200.

同一個用戶第二次這個文件的請求
客戶端在一次發起HTTP GET請求一個文件,注意這個時候客戶端同時發送一個If-None-Match頭,這個頭中會包括上次這個文件的Etag(例如"2e681a- 6-5d044840"),這時服務器判斷發送過來的Etag和自己計算出來的Etag,因此If-None-Match為False,不返回200,返 回304,客戶端繼續使用本地緩存;

注意.服務器又設置了Cache-Control:max-age和Expires時,會同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之后,服務器才能返回304.

下面是在Apache中的Etag的配置

在Apache中設置Etag的支持比較簡單,只需要在apache的配置中加入下面的內容就可以了:

FileETag MTime Size

注解:FileETag指令配置了當文檔是基於一個文件時用以創建ETag(實體標簽)應答頭的文件的屬性(ETag的值用於進行緩沖管理以節約網絡帶 寬).ETag的值由文件的inode(索引節點)、大小、最后修改時間決定.FileETag指令可以讓您選擇(如果您想進行選擇)這其中哪些要素將被 使用.主要關鍵字如下:

INode
    文件的索引節點(inode)數
MTime
    文件的最后修改日期及時間
Size
    文件的字節數
All
    所有存在的域,等價於:FileETag INode MTime Size
None
    如果一個文檔是基於文件的,則不在應答中包含任何ETag頭

在大型多WEB集群時,使用ETag時有問題,所以有人建議使用WEB集群時不要使用ETag,其實很好解決,因為多服務器時,INode不一樣,所以不 同的服務器生成的ETag不一樣,所以用戶有可能重復下載(這時ETag就會不准),明白了上面的原理和設置后,解決方法也很容易,讓ETag后面二個參 數,MTime和Size就好了.只要ETag的計算沒有INode參於計算,就會很准了.


 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM