瀏覽器在請(qǐng)求已經(jīng)訪問(wèn)過(guò)的URL時(shí),會(huì)判斷是否使用緩存缭付,判斷是否是由緩存的主要依據(jù)是緩存是否在有效期內(nèi)拆火,如果在有效期內(nèi),則會(huì)直接使用緩存(如上圖中的情況宜猜,注意status code
)這一部分主要通過(guò)response header中的兩個(gè)字段來(lái)判斷:
- Expires:
表示有效期泼返,是一個(gè)GMT時(shí)間,以客戶端為基準(zhǔn)姨拥,與服務(wù)器時(shí)間可能存在一定時(shí)間差 - Cache-Control中的max-age值:
表示最大有效時(shí)間绅喉,單位是s渠鸽,優(yōu)先級(jí)比expires高,為了解決expires時(shí)間差的問(wèn)題而出現(xiàn)的
當(dāng)超過(guò)緩存期時(shí)柴罐,瀏覽器不會(huì)直接請(qǐng)求資源徽缚,而是判斷緩存是否有更新,能否繼續(xù)使用革屠,判斷方法有兩種:
- Last-Modified和 if-Modified-Since:當(dāng)瀏覽器第一次請(qǐng)求某個(gè)資源時(shí)凿试,服務(wù)器的響應(yīng)中有一個(gè)Last-Modified字段,表示最近一個(gè)修改緩存的時(shí)間似芝,當(dāng)緩存過(guò)期后那婉,瀏覽器就會(huì)把這個(gè)時(shí)間放在請(qǐng)求的If-Modified-Since字段中并發(fā)送給服務(wù)器,由服務(wù)器來(lái)判斷緩存是否有更新
- Etag和If-Node-Match:當(dāng)瀏覽器第一次請(qǐng)求某個(gè)資源時(shí)党瓮,服務(wù)器的響應(yīng)中有一個(gè)ETag字段详炬,是用于表示文件的字符串,一旦文件更新麻诀,該字段就會(huì)發(fā)生變化痕寓;當(dāng)緩存過(guò)期后,瀏覽器會(huì)把該字段的內(nèi)容放在請(qǐng)求的If-None-Match字段中蝇闭,并發(fā)送給服務(wù)器呻率,由服務(wù)器來(lái)判斷緩存是否有更新。
注意:Etag比Last-Modified的更高(因?yàn)镋tag更加準(zhǔn)確呻引,而Last-Modified只能精確到秒)