Cache-Control 是最重要的規(guī)則。這個(gè)字段用于指定所有緩存機(jī)制在整個(gè)請(qǐng)求/響應(yīng)鏈中必須服從的指令。這些指令指定用于阻止緩存對(duì)請(qǐng)求或響應(yīng)造成不利干擾的行為。這些指令通常覆蓋默認(rèn)緩存算法。緩存指令是單向的,即請(qǐng)求中存在一個(gè)指令并不意味著響應(yīng)中將存在同一個(gè)指令。
cache-control 定義是:Cache-Control = "Cache-Control" ":" cache-directive。表 1 展示了適用的值。
Cache-directive | 說(shuō)明 |
---|---|
public | 所有內(nèi)容都將被緩存 |
private | 內(nèi)容只緩存到私有緩存中 |
no-cache | 所有內(nèi)容都不會(huì)被緩存 |
no-store | 所有內(nèi)容都不會(huì)被緩存到緩存或 Internet 臨時(shí)文件中 |
must-revalidation/proxy-revalidation | 如果緩存的內(nèi)容失效,請(qǐng)求必須發(fā)送到服務(wù)器/代理以進(jìn)行重新驗(yàn)證 |
max-age=xxx (xxx is numeric) | 緩存的內(nèi)容將在 xxx 秒后失效 |
表 2 表明在不同的情形下,瀏覽器是將請(qǐng)求重新發(fā)送到服務(wù)器還是使用緩存的內(nèi)容。
表 2. 對(duì) cache-directive 值的瀏覽器響應(yīng)
Cache-directive | 打開(kāi)一個(gè)新的瀏覽器窗口 | 在原窗口中單擊 Enter 按鈕 | 刷新 | 單擊 Back 按鈕 |
---|---|---|---|---|
public | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
private | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 第一次,瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器;此后,瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
no-cache/no-store | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 |
must-revalidation/proxy-revalidation | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 第一次,瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器;此后,瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
max-age=xxx (xxx is numeric) | 在 xxx 秒后,瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 在 xxx 秒后,瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 | 在 xxx 秒后,瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器 |
Cache-Control 是關(guān)于瀏覽器緩存的最重要的設(shè)置,因?yàn)樗采w其他設(shè)置,比如 Expires 和 Last-Modified。另外,由于瀏覽器的行為基本相同,這個(gè)屬性是處理跨瀏覽器緩存問(wèn)題的最有效的方法。
Expires 頭部字段提供一個(gè)日期和時(shí)間,響應(yīng)在該日期和時(shí)間后被認(rèn)為失效。失效的緩存條目通常不會(huì)被緩存(無(wú)論是代理緩存還是用戶代理緩存)返回,除非首先通過(guò)原始服務(wù)器(或者擁有該實(shí)體的最新副本的中介緩存)驗(yàn)證。(注意:cache-control max-age 和 s-maxage 將覆蓋 Expires 頭部。)
Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看內(nèi)容時(shí)的日期在給定的日期之前,則認(rèn)為該內(nèi)容沒(méi)有失效并從緩存中提取出來(lái)。反之,則認(rèn)為該內(nèi)容失效,緩存將采取一些措施。表 3-6 表明針對(duì)不同用戶操作的不同瀏覽器的行為。
表 3. 當(dāng)用戶打開(kāi)一個(gè)新的瀏覽器窗口時(shí)的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容沒(méi)有失效 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
內(nèi)容失效 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 4. 當(dāng)用戶在原始瀏覽器窗口中單擊 Enter 按鈕時(shí)的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容沒(méi)有失效 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 |
內(nèi)容失效 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 5. 當(dāng)用戶按 F5 鍵刷新頁(yè)面時(shí)的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容沒(méi)有失效 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 |
內(nèi)容失效 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 6. 當(dāng)用戶單擊 Back 或 Forward 按鈕時(shí)的失效操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容沒(méi)有失效 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
內(nèi)容失效 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
注意:所有瀏覽器都假定為使用默認(rèn)設(shè)置運(yùn)行。
Last-Modified 實(shí)體頭部字段值通常用作一個(gè)緩存驗(yàn)證器。簡(jiǎn)單來(lái)說(shuō),如果實(shí)體值在 Last-Modified 值之后沒(méi)有被更改,則認(rèn)為該緩存條目有效。ETag 響應(yīng)頭部字段值是一個(gè)實(shí)體標(biāo)記,它提供一個(gè) “不透明” 的緩存驗(yàn)證器。這可能在以下幾種情況下提供更可靠的驗(yàn)證:不方便存儲(chǔ)修改日期;HTTP 日期值的 one-second 解決方案不夠用;或者原始服務(wù)器希望避免由于使用修改日期而導(dǎo)致的某些沖突。
不同的瀏覽器有不同的配置行為。表 7-10 表明針對(duì)不同用戶操作的不同瀏覽器的行為。
表 7. 當(dāng)用戶打開(kāi)一個(gè)新的瀏覽器窗口時(shí)的 Last-Modified E-Tag 操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容自上次訪問(wèn)以來(lái)沒(méi)有被修改 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 |
內(nèi)容自上次訪問(wèn)以來(lái)已經(jīng)被修改 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 8. 當(dāng)用戶在原始瀏覽器窗口中單擊 Enter 按鈕時(shí)的 Last-Modified E-Tag 操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容自上次訪問(wèn)以來(lái)沒(méi)有被修改 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 |
內(nèi)容自上次訪問(wèn)以來(lái)已經(jīng)被修改 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 9. 當(dāng)用戶按 F5 鍵刷新頁(yè)面時(shí)的 Last-Modified E-Tag 操作
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容自上次訪問(wèn)以來(lái)沒(méi)有被修改 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 304 |
內(nèi)容自上次訪問(wèn)以來(lái)已經(jīng)被修改 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
表 10. 沒(méi)有緩存設(shè)置且用戶單擊 Back 或 Forward 按鈕
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
內(nèi)容自上次訪問(wèn)以來(lái)沒(méi)有被修改 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 |
內(nèi)容自上次訪問(wèn)以來(lái)已經(jīng)被修改 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
注意:所有瀏覽器都假定使用默認(rèn)設(shè)置運(yùn)行。
如果您不定義任何緩存相關(guān)設(shè)置,則不同的瀏覽器有不同的行為。有時(shí),同一個(gè)瀏覽器在相同的情形下每次運(yùn)行時(shí)的行為都是不同的。情況可能很復(fù)雜。另外,有些不該緩存的內(nèi)容如果被緩存,將會(huì)導(dǎo)致安全問(wèn)題。
不同的瀏覽器有不同的行為。表 11 展示了不同的瀏覽器行為。
表 11. 沒(méi)有緩存設(shè)置且用戶打開(kāi)一個(gè)新的瀏覽器窗口
Firefox 3.5 | IE 8 | Chrome 3 | Safari 4 | |
---|---|---|---|---|
打開(kāi)一個(gè)新頁(yè)面 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
在原始窗口中單擊 Enter 按鈕 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面。 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
按 F5 鍵刷新 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
單擊 Back 或 Forward 按鈕 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面。 | 瀏覽器呈現(xiàn)來(lái)自緩存的頁(yè)面。 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 | 瀏覽器重新發(fā)送請(qǐng)求到服務(wù)器。返回代碼是 200 |
注意:所有瀏覽器都假定使用默認(rèn)設(shè)置運(yùn)行。
聯(lián)系客服