1.狀態(tài)碼304
客戶端有緩存的文檔發(fā)出一個條件性的請求(提供If-Modified-Since頭標(biāo)識客戶端緩存修改時間),服務(wù)器告訴客戶端怀浆,原來緩存的文檔還可以繼續(xù)使用谊囚。
2.具體過程
- 客戶端請求一個資源時,發(fā)現(xiàn)自己緩存的文件有Last Modified执赡,那么在請求中會包含If Modified Since,這個時間就是緩存文件的最后修改時間镰踏。
- 服務(wù)器根據(jù)這個時間和當(dāng)前請求文件的修改時間,就可以確定是否返回304還是200沙合,對于靜態(tài)文件奠伪,服務(wù)器會自動完成最后修改時間的比較,完成緩存或者更新首懈,返回304則表明绊率,該資源從上次緩存到現(xiàn)在并沒有修改過,條件請求可以確本柯模客戶端資源是最新的同時妹笆,避免每次都請求完整資源給服務(wù)器帶來的性能問題烈炭。
- 對于動態(tài)頁面枝誊,往往沒有Last Modified信息逻淌,瀏覽器和代理服務(wù)器不會做緩存,每次請求的時候都會完成一次200的請求盯仪。
- 如果要對動態(tài)html頁面做緩存加速紊搪,那么服務(wù)器要在響應(yīng)報文的頭部添加Last Modified定義,再根據(jù)請求報文中的If Modified Since來決定返回200還是304全景,如果返回304則返回的只是一個響應(yīng)報文的頭部耀石,不包含主題部分,從而大大降低帶寬的消耗爸黄,提高用戶體驗滞伟。
3.瀏覽器判斷緩存是否可用的流程
瀏覽器如何判斷緩存是否過期?
根據(jù)相應(yīng)報文的Cache-Control和Expires這兩個屬性炕贵,這兩個屬性記錄了資源過期的時間梆奈,在該日期前的所有對資源的請求都會直接使用瀏覽器緩存,返回200狀態(tài)碼称开,而不會向服務(wù)器請求亩钟,兩個屬性都存在時Cache-Control優(yōu)先級較高乓梨。服務(wù)端如何判斷緩存已失效?
Last-Modified
當(dāng)緩存過期時清酥,發(fā)現(xiàn)資源具有Last-Modified聲明扶镀,則在請求頭部帶上If-Modified-Since,服務(wù)器收到相應(yīng)請求后焰轻,會將這個信息與請求資源最后修改時間進行對比臭觉,如果資源修改時間較新,則說明資源被改動了辱志,則相應(yīng)HTTP200和相應(yīng)資源胧谈,若最后修改時間較舊,說明資源無新修改荸频,則相應(yīng)HTTP304,瀏覽器直接繼續(xù)使用所保存的cache
Etag
資源在服務(wù)器的唯一標(biāo)識(生成規(guī)則由服務(wù)器決定)客冈,緩存過期時旭从,發(fā)現(xiàn)資源帶有Etag聲明,則會在請求頭部帶上If-None-Match场仲,服務(wù)器收到請求后會與被請求資源的相應(yīng)校驗串對比和悦,決定返回200或204
注意:服務(wù)器可以根據(jù)自己的緩存機制的需要,選擇ETag或Last-Modified來做緩存判斷的依據(jù)渠缕,甚至可以兩個同時參考為什么有Last-Modified還要Etag鸽素?
1.Last-Modified標(biāo)注的時間只能精確到秒
2.如果文件被定期生成,當(dāng)有時內(nèi)容沒有什么變化亦鳞,但Last-Modified改變了馍忽,導(dǎo)致文件沒法使用緩存
3.服務(wù)器沒有準(zhǔn)確獲取文件修改時間200OK(from cache)和304 Not Modified的區(qū)別?
1.200OK不會向服務(wù)器發(fā)送請求燕差,本地的資源沒有過期遭笋,直接使用本地緩存文件。
2.304Not Modified則向服務(wù)器詢問徒探,如果服務(wù)器認(rèn)為瀏覽器的緩存還能使用瓦呼,則返回304。
一般手動刷新時测暗,都會向服務(wù)器詢問本地緩存是否能使用央串,返回304
4.Cache-Control策略
指明資源的有效期,選擇更多設(shè)置更細(xì)致碗啄,與Expires同時設(shè)置质和,優(yōu)先級高于Expires,其中max-age指示資源的過期時間
而Expires策略則是,返回的到期時間為服務(wù)端的時間稚字,客戶端時間和服務(wù)器時間相差很大侦另,那么誤差就會很大,在HTTP1.1版開始,使用Cache-Control的max-age字段來代替
例如褒傅,外網(wǎng)一般會對html文件設(shè)置一個較短的緩存時間弃锐,如cache-control: max-age=600;對于js和css文件設(shè)置一個較長的緩存時間殿托,如cache-control: max-age=31536000霹菊,js和css文件由文件的md5后綴來決定是否重新加載;圖片文件則可以在鏈接中加上max_age參數(shù)支竹,服務(wù)端會以此返回對應(yīng)Cache-Control響應(yīng)頭