HTTP头信息中的参数Etag
下面開(kāi)始介紹 Etag:
?????? Etag在HTTP1.1中有介紹,主要的作用就是在(css file, image, javascript file)文件后面添加一個(gè)唯一的參數(shù)(相當(dāng)于查詢參數(shù)字符串),Etag有服務(wù)器端生成,并且隨著文件的改變而改變,這樣瀏覽器端就會(huì)只重新請(qǐng)求獲取 Etag發(fā)生變化的文件,減少瀏覽器端數(shù)據(jù)的流量,加快瀏覽器的反應(yīng)速度,重要的是減輕服務(wù)器端的壓力,所以服務(wù)器端Etag的實(shí)現(xiàn)就比較重要了。
現(xiàn)在我們有個(gè)問(wèn)題為什么要使用Etag呢?
Etag主要為了解決Last-Modified無(wú)法解決的一些問(wèn)題.他能比Last_Modified更加精確的知道文件是否被修改過(guò).如果有個(gè)文件修改非常頻繁,比如在秒以下的時(shí)間內(nèi)進(jìn)行修改,比如1秒內(nèi)修改了10次,If-Modified-Since能檢查只能秒級(jí)的修改,所以這種修改無(wú)法判斷.原因是UNIX記錄MTIME只能精確到秒.所以我們選擇生成Etag,因?yàn)镋tag可以綜合Inode,MTime和Size,可以避免這個(gè)問(wèn)題.
Etag的工作原理
Etag在服務(wù)器上生成后,客戶端通過(guò)If-Match或者說(shuō)If-None-Match這個(gè)條件判斷請(qǐng)求來(lái)驗(yàn)證資源是否修改。我們常見(jiàn)的是使用If-None-Match.請(qǐng)求一個(gè)文件的流程可能如下:
新的請(qǐng)求
客戶端發(fā)起HTTP GET請(qǐng)求一個(gè)文件(css ,image,js);服務(wù)器處理請(qǐng)求,返回文件內(nèi)容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http頭狀態(tài)碼為為200.
同一個(gè)用戶第二次這個(gè)文件的請(qǐng)求
客戶端在一次發(fā)起HTTP GET請(qǐng)求一個(gè)文件,注意這個(gè)時(shí)候客戶端同時(shí)發(fā)送一個(gè)If-None-Match頭,這個(gè)頭中會(huì)包括上次這個(gè)文件的Etag(例如"2e681a- 6-5d044840"),這時(shí)服務(wù)器判斷發(fā)送過(guò)來(lái)的Etag和自己計(jì)算出來(lái)的Etag,因此If-None-Match為False,不返回200,返回304,客戶端繼續(xù)使用本地緩存;
注意.服務(wù)器又設(shè)置了Cache-Control:max-age和Expires時(shí),會(huì)同時(shí)使用,也就是說(shuō)在完全匹配If-Modified-Since和If-None-Match即檢查完修改時(shí)間和Etag之后,服務(wù)器才能返回304.
下面是在Apache中的Etag的配置
在Apache中設(shè)置Etag的支持比較簡(jiǎn)單,只需要在apache的配置中加入下面的內(nèi)容就可以了:
FileETag MTime Size
注解:FileETag指令配置了當(dāng)文檔是基于一個(gè)文件時(shí)用以創(chuàng)建ETag(實(shí)體標(biāo)簽)應(yīng)答頭的文件的屬性(ETag的值用于進(jìn)行緩沖管理以節(jié)約網(wǎng)絡(luò)帶寬)。ETag的值由文件的inode(索引節(jié)點(diǎn))、大小、最后修改時(shí)間決定。FileETag指令可以讓您選擇(如果您想進(jìn)行選擇)這其中哪些要素將被使用。主要關(guān)鍵字如下:
INode
文件的索引節(jié)點(diǎn)(inode)數(shù)
MTime
文件的最后修改日期及時(shí)間
Size
文件的字節(jié)數(shù)
All
所有存在的域,等價(jià)于:FileETag INode MTime Size
None
如果一個(gè)文檔是基于文件的,則不在應(yīng)答中包含任何ETag頭
在大型多WEB集群時(shí),使用ETag時(shí)有問(wèn)題,所以有人建議使用WEB集群時(shí)不要使用ETag,其實(shí)很好解決, 因?yàn)槎喾?wù)器時(shí),INode不一樣,所以不同的服務(wù)器生成的ETag不一樣,所以用戶有可能重復(fù)下載(這時(shí)ETag就會(huì)不準(zhǔn)),明白了上面的原理和設(shè)置后,解決方法也很容易,讓ETag后面二個(gè)參數(shù),MTime和Size就好了.只要ETag的計(jì)算沒(méi)有INode參與計(jì)算,就會(huì)很準(zhǔn)了.
如果動(dòng)態(tài)程序要生成ETAG 也很簡(jiǎn)單,如: $etag = ‘”‘ . md5($body) . ‘”‘;
總結(jié)
以上是生活随笔為你收集整理的HTTP头信息中的参数Etag的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “只见火光烧润屋”下一句是什么
- 下一篇: 这样配宠好吗?觉醒大天使,蛛后,睡神,觉