1. 程式人生 > >HTTP頭的Expires與Cache-control

HTTP頭的Expires與Cache-control

1.概念

Cache-control用於控制HTTP快取(在HTTP/1.0中可能部分沒實現,僅僅實現了Pragma: no-cache

資料包中的格式:

Cache-Control: cache-directive

cache-directive可以為以下:

request時用到:

| "no-cache"

| "no-store"

| "max-age" "=" delta-seconds

| "max-stale" [ "=" delta-seconds ]

| "min-fresh" "=" delta-seconds

| "no-transform"

| "only-if-cached"

| "cache-extension"

response時用到:

| "public"

| "private" [ "=" <"> field-name <"> ]

| "no-cache" [ "=" <"> field-name <"> ]

| "no-store"

| "no-transform"

| "must-revalidate"

| "proxy-revalidate"

| "max-age" "=" delta-seconds

| "s-maxage" "=" delta-seconds

| "cache-extension"

部分說明:

根據是否可快取分為

Public  指示響應可被任何快取區快取。

Private  指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當用戶的

部分響應訊息,此響應訊息對於其他使用者的請求無效。

no-cache  指示請求或響應訊息不能快取(HTTP/1.0Pragmano-cache替換)

根據什麼能被快取

no-store  用於防止重要的資訊被無意的釋出。在請求訊息中傳送將使得請求和響應訊息都不使用快取。

根據快取超時

max-age  指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。

min-fresh  指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。

max-stale  指示客戶機可以接收超出超時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以

接收超出超時期指定值之內的響應訊息。

Expires 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求),等同max-age

效果。但是如果同時存在,則被Cache-Controlmax-age覆蓋。

格式:

Expires = "Expires" ":" HTTP-date

例如

Expires: Thu, 01 Dec 1994 16:00:00 GMT 必須是GMT格式

2.應用

通過HTTPMETA設定expirescache-control

<meta http-equiv="Cache-Control" content="max-age=7200" />

<meta http-equiv="Expires" content="Mon, 20 Jul 2009 23:00:00 GMT" />

上述設定僅為舉例,實際使用其一即可。這樣寫的話僅對該網頁有效,對網頁中的圖片或其他請求無效,並不會做任何cache

這樣客戶端的請求就多了,儘管只是檢查Last-modified狀態的東西,但是請求一多對瀏覽速度必定有影響。

如果要對檔案新增cache可以通過apachemod_expire模組,寫法為

<IfModule mod_expires.c>

ExpiresActive On

ExpiresDefault "access plus 1 days"

</IfModule>

記得ExpiresActive設為On,我起先沒設定On,似乎怎樣YSlow都查不到快取機制。這樣新增的話就是預設所有的。

如果要針對個別MIME型別則可以:

ExpiresByType image/gif "access plus 5 hours 3 minutes"

另外,當點選瀏覽器上的重新整理,客戶端傳送的請求中均是max-age=0,表示validate操作,傳送請求到伺服器

要求檢查cache,再更新cache,一般得到的是304 Not Modified,表示沒變動。

!!具體例項各類操作與Cache-control選項的關係:

網頁的快取是由 HTTP訊息頭中的“Cache-control”來控制的,常見的取值有privateno-cachemax-agemust- revalidate等,預設為private。其作用根據不同的重新瀏覽方式分為以下幾種情況:

1) 開啟新視窗

    值為privateno-cachemust-revalidate,那麼開啟新視窗訪問時都會重新訪問伺服器。

而如果指 定了max-age值,那麼在此值內的時間裡就不會重新訪問伺服器,例如:

Cache-control: max-age=5(表示當訪問此網頁後的5內再次訪問不 會去伺服器)

2) 在位址列回車

    值為privatemust-revalidate則只有第一次訪問時會訪問伺服器,以後就不再訪問。

    值為no-cache,那麼每次都會訪問。

    值為max-age,則在過期之前不會重複訪問。

3) 按後退按扭

   值為privatemust-revalidatemax-age,則不會重訪問,

   值為no-cache,則每次都重複訪問

4) 按重新整理按扭

  無論為何值,都會重複訪問

Cache-control值為“no-cache”時,訪問此頁面不會 在Internet臨時文章夾留下頁面備份。

另外,通過指定“Expires”值也會影響到快取。 例如,指定Expires值為一個早已過去的時間,那麼訪問此網時若重複在位址列按回車,那麼每次都會重複訪問: Expires: Fri, 31 Dec 1999 16:00:00 GMT

比如:禁止頁面在IE中快取

http響應訊息頭 部設定:

CacheControl = no-cache

Pragma=no-cache

Expires = -1

Expires是個好東東,如果伺服器上的網頁經常變化,就把它設定為-1,表示立即過期。如果一個網頁 每天凌晨1點更新,可以把Expires設定為第二天的凌晨1點。

HTTP1.1伺服器指定 CacheControl = no-cache時,瀏覽器就不會快取該網頁。

<!--EndFragment-->