Etag在HTTP1.1中有介紹,主要的作用就是在(css file, image, javascript file)文件后面添加一個唯一的參數(shù)(相當于查詢參數(shù)字符串),Etag有服務器端生成,并且隨著文件的改變而改變,這樣瀏覽器端就會只重新請求獲取Etag發(fā)生變化的文件,減少瀏覽器端數(shù)據(jù)的流量,加快瀏覽器的反應速度,重要的是減輕服務器端的壓力,所以服務器端Etag的實現(xiàn)就比較重要了。
現(xiàn)在我們有個問題為什么要使用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.請求一個文件的流程可能如下:
新的請求
客戶端發(fā)起HTTP GET請求一個文件(css ,image,js);服務器處理請求,返回文件內容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http頭狀態(tài)碼為為200.
同一個用戶第二次這個文件的請求
客戶端在一次發(fā)起HTTP GET請求一個文件,注意這個時候客戶端同時發(fā)送一個If-None-Match頭,這個頭中會包括上次這個文件的Etag(例如"2e681a-6-5d044840"),這時服務器判斷發(fā)送過來的Etag和自己計算出來的Etag,因此If-None-Match為False,不返回200,返回304,客戶端繼續(xù)使用本地緩存;
注意.服務器又設置了Cache-Control:max-age和Expires時,會同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之后,服務器才能返回304.
下面是在Apache中的Etag的配置
在Apache中設置Etag的支持比較簡單,只需要在apache的配置中加入下面的內容就可以了:
FileETag MTime Size
注解:FileETag指令配置了當文檔是基于一個文件時用以創(chuàng)建ETag(實體標簽)應答頭的文件的屬性(ETag的值用于進行緩沖管理以節(jié)約網絡帶寬)。ETag的值由文件的inode(索引節(jié)點)、大小、最后修改時間決定。FileETag指令可以讓您選擇(如果您想進行選擇)這其中哪些要素將被使用。主要關鍵字如下:
INode
文件的索引節(jié)點(inode)數(shù)
MTime
文件的最后修改日期及時間
Size
文件的字節(jié)數(shù)
All
所有存在的域,等價于:FileETag INode MTime Size
None
如果一個文檔是基于文件的,則不在應答中包含任何ETag頭
在大型多WEB集群時,使用ETag時有問題,所以有人建議使用WEB集群時不要使用ETag,其實很好解決,因為多服務器時,INode不一樣,所以不同的服務器生成的ETag不一樣,所以用戶有可能重復下載(這時ETag就會不準),明白了上面的原理和設置后,解決方法也很容易,讓ETag后面二個參數(shù),MTime和Size就好了.只要ETag的計算沒有INode參于計算,就會很準了.
原文:http://www.php-oa.com/2008/08/27/etag.html
新聞熱點
疑難解答