expires与etag控制页面缓存的优先级
生活随笔
收集整理的這篇文章主要介紹了
expires与etag控制页面缓存的优先级
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
expires指令控制HTTP應(yīng)答中的“Expires”和“Cache-Control”Header頭部信息,啟動控制頁面緩存的作用 time:可以使用正數(shù)或負(fù)數(shù)。“Expires”頭標(biāo)的值將通過當(dāng)前系統(tǒng)時間加上設(shè)定time值來設(shè)定。 time值還控制"Cache-Control"的值: 負(fù)數(shù)表示no-cache 正數(shù)或零表示max-age=time ?expires使用了特定的時間,并且要求服務(wù)器和客戶端的是中嚴(yán)格同步。
而Cache-Control是用max-age指令指定組件被緩存多久。
對于不支持http1.1的瀏覽器,還是需要expires來控制。所以最好能指定兩個響應(yīng)頭。但HTTP規(guī)范規(guī)定max-age指令將重寫expires頭。 一般用于頁面變化不是很快的時候,如果緩存過期了,瀏覽器在重用它之前會首先確認(rèn)他是否有效,就是一個“條件GET請求”,如果有效,返回304狀態(tài)碼。 expires通過Last-Modified響應(yīng)頭來確定。如圖:
第一次訪問:
請求:
返回:
第二次訪問:
請求:
返回:
這時返回的狀態(tài)碼是304,而在請求中比第一次多了If-Modified-Since頭,和原始服務(wù)器中的Last-Modified制作比較,所以實(shí)現(xiàn)瀏覽器緩存并判斷是否過期。
簡單的說,Last-Modified 與If-Modified-Since 都是用于記錄頁面最后修改時間的 HTTP 頭信息,只是 Last-Modified 是由服務(wù)器往客戶端發(fā)送的 HTTP 頭,而 If-Modified-Since 則是由客戶端往服務(wù)器發(fā)送的頭,可以看到,再次請求本地存在的 cache 頁面時,客戶端會通過 If-Modified-Since 頭將先前服務(wù)器端發(fā)過來的 Last-Modified 最后修改時間戳發(fā)送回去,這是為了讓服務(wù)器端進(jìn)行驗(yàn)證,通過這個時間戳判斷客戶端的頁面是否是最新的,如果不是最新的,則返回新的內(nèi)容,如果是最新的,則返回304告訴客戶端其本地 cache 的頁面是最新的,于是客戶端就可以直接從本地加載頁面了,這樣在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)就會大大減少,同時也減輕了服務(wù)器的負(fù)擔(dān)。
如果不想讓代理或?yàn)g覽器緩存,加no-cache參數(shù)或private參數(shù):
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
etag: 實(shí)體標(biāo)簽,是用來確認(rèn)web服務(wù)器和瀏覽器緩存有效性的一種機(jī)制。 原始服務(wù)器使用ETag響應(yīng)頭來指定組件的ETag 瀏覽器通過If-None-Match頭將ETag傳回原始服務(wù)器。如果匹配,返回304
如圖:
第一次訪問:
請求:
返回:
第二次請求:
返回:
依然返回的狀態(tài)碼是304,而在請求中比第一次多了If-None-Match頭。所以實(shí)現(xiàn)瀏覽器緩存。如果這個值對不上,則緩存過期。
ETags和If-None-Match是一種常用的判斷資源是否改變的方法。類似于Last-Modified和HTTP-If-Modified-Since。但是有所不同的是Last-Modified和HTTP-If-Modified-Since只判斷資源的最后修改時間,而ETags和If-None-Match可以是資源任何的任何屬性。
ETags和If-None-Match的工作原理是在HTTP Response中添加ETags信息。當(dāng)客戶端再次請求該資源時,將在HTTP Request中加入If-None-Match信息(ETags的值)。如果服務(wù)器驗(yàn)證資源的ETags沒有改變(該資源沒有改變),將返回一個304狀態(tài);否則,服務(wù)器將返回200狀態(tài),并返回該資源和新的ETags。
IIS上的ETag格式需要修改。 是選擇ETags還是 Etag主要為了解決Last-Modified無法解決的一些問題.他能比Last_Modified更加精確的知道文件是否被修改過.如果有個文件修改非常頻繁,比如在秒以下的時間內(nèi)進(jìn)行修改,比如1秒內(nèi)修改了10次,If-Modified-Since能檢查只能秒級的修改,所以這種修改無法判斷. 原因是UNIX記錄MTIME只能精確到秒。
?
在大型多WEB集群時,使用ETag時有問題,所以有人建議使用WEB集群時不要使用ETag,其實(shí)很好解決,因?yàn)槎喾?wù)器時,INode不一樣,所以不同的服務(wù)器生成的ETag不一樣,所以用戶有可能重復(fù)下載(這時ETag就會不準(zhǔn))
如果服務(wù)器端同時設(shè)置了Etag和Expires 時,Etag原理同樣,即與Last-Modified/Etag對應(yīng)的HttpRequest Header:If-Modified-Since和If-None-Match。我們可以看到這兩個Header的值和WebServer發(fā)出的 Last-Modified,Etag值完全一樣;在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和 Etag之后,服務(wù)器才能返回304. 如果服務(wù)器又設(shè)置了Cache-Control:max-age和Expires呢,怎么辦?
答案是同時使用,也就是說在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之后,服務(wù)器才能返回304.(不要陷入到底使用誰的問題怪圈)
總結(jié)
以上是生活随笔為你收集整理的expires与etag控制页面缓存的优先级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修苹果手机多少钱啊?
- 下一篇: CI框架验证码CAPTCHA 辅助函数的