1. 程式人生 > >Nginx下關於緩存控制字段cache-control的配置說明

Nginx下關於緩存控制字段cache-control的配置說明

失敗 瀏覽器緩存 服務器集群 描述 組合 狀態碼 err 緩存機制 bash

HTTP協議的Cache -Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control並不會影響另一個消息處理過程中的緩存處理過程。
請求時的緩存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached等。
響應消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。

下面做一詳細總結, 方便在以後的運維工作中理解和運用.

一. 瀏覽器中關於Cache的3屬性:


1. Cache-Control:
設置相對過期時間, max-age指明以秒為單位的緩存時間. 若對靜態資源只緩存一次, 可以設置max-age的值為315360000000 (一萬年).

Http協議的cache-control的常見取值及其組合釋義:
no-cache: 數據內容不能被緩存, 每次請求都重新訪問服務器, 若有max-age, 則緩存期間不訪問服務器.
no-store: 不僅不能緩存, 連暫存也不可以(即: 臨時文件夾中不能暫存該資源).
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問服務器, 若有max-age, 則緩存期間不訪問服務器.
public: 可以被任何緩存區緩存, 如: 瀏覽器、服務器、代理服務器等.

max-age: 相對過期時間, 即以秒為單位的緩存時間.
no-cache, private: 打開新窗口時候重新訪問服務器, 若設置max-age, 則緩存期間不訪問服務器.
- private, 正數的max-age: 後退時候不會訪問服務器.
- no-cache, 正數的max-age: 後退時會訪問服務器.

2. Expires:
設置以分鐘為單位的絕對過期時間, 優先級比Cache-Control低, 同時設置Expires和Cache-Control則後者生效.

3. Last-Modified:
該資源的最後修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發送一個請求到服務器上, 並附上If-Unmodified-Since頭來說明瀏覽器所緩存資源的最後修改時間, 如果服務器發現沒有修改, 則直接返回304(Not Modified)回應信息給瀏覽器(內容很少), 如果服務器對比時間發現修改了, 則照常返回所請求的資源.

需要註意:
1) Last-Modified屬性通常和Expires或Cache-Control屬性配合使用, 因為即使瀏覽器設置緩存, 當用戶點擊”刷新”按鈕時, 瀏覽器會忽略緩存繼續向服務器發送請求, 這時Last-Modified將能夠很好的減小回應開銷.

2) ETag將返回給瀏覽器一個資源ID, 如果有了新版本則正常發送並附上新ID, 否則返回304, 但是在服務器集群情況下, 每個服務器將返回不同的ID, 因此不建議使用ETag.

以上描述的客戶端瀏覽器緩存是指存儲位置在客戶端瀏覽器, 但是對客戶端瀏覽器緩存的實際設置工作是在服務器上的資源中完成的. 雖然剛才介紹了有關於客戶端瀏覽器緩存的屬性, 但是實際上對這些屬性的設置工作都需要在服務器的資源中做設置. 我們有兩種操作手段對瀏覽器緩存進行設置, 一個是通過頁面指令聲明來設置, 另外一個是通過編程方式來設置.

二. http Headers模塊 (設置HTTP報文的頭標)
Nginx的ngx_http_headers_module模塊可以對Cache-Control頭相關的東西進行配置, 比如:

expires     24h;
expires     0;
expires     -1;
expires     epoch;
add_header  Cache-Control  private;

指令
add_header add_header
expires expires

增加頭標
語法: add_header name value
默認值: none
作用域: http, server, location
當HTTP應答狀態碼為 200、204、301、302 或 304 的時候,增加指定的HTTP頭標。其中頭標的值可以使用變量。

expires
語法: expires [time|epoch|max|off
默認值: expires off
作用域: http, server, location
使用本指令可以控制HTTP應答中的“Expires”和“Cache-Control”的頭標,(起到控制頁面緩存的作用)。

可以在time值中使用正數或負數。“Expires”頭標的值將通過當前系統時間加上您設定的 time 值來獲得。

epoch

指定“Expires”的值為 1 January, 1970, 00:00:01 GMT。

max

指定“Expires”的值為 31 December 2037 23:59:59 GMT,“Cache-Control”的值為10年。

-1

指定“Expires”的值為 服務器當前時間 -1s,即永遠過期.

"Cache-Control"頭標的值由您指定的時間來決定:
- 負數

Cache-Control: no-cache

- 正數或零

Cache-Control: max-age = #

# 為您指定時間的秒數。

"off" 表示不修改“Expires”和“Cache-Control”的值;

下面是相關頁面設置Cache-Control頭信息的幾個簡單配置:
例一:

  if ($request_uri ~* "^/$|^/search/.+/|^/company/.+/") {
     add_header    Cache-Control  max-age=3600;
    }

例二:

location ~ .*\.(css|js|swf|php|htm|html )$ {
      add_header Cache-Control no-store;
}

例三:

location ~ .*\.(js|css)$ {
     expires 10d;
}

三. Cache-Control
Cache-Control 通用消息頭字段被用於在http 請求和響應中通過指定指令來實現緩存機制。緩存指令是單向的, 這意味著在請求設置的指令,在響應中不一定包含相同的指令。

語法
指令不區分大小寫,並且具有可選參數,可以用令牌或者帶引號的字符串語法。多個指令以逗號分隔。

緩存請求指令
客戶端可以在HTTP請求中使用的標準 Cache-Control 指令。

Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache 
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached

緩存相應指令
服務器可以在響應中使用的標準 Cache-Control 指令。

Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>

擴展Cache-Control指令
拓展緩存指令不是核心HTTP緩存標準文檔的一部分,使用前請註意檢查 兼容性!

Cache-control: immutable 
Cache-control: stale-while-revalidate=<seconds>
Cache-control: stale-if-error=<seconds>

指令
- 可緩存性
public
表明響應可以被任何對象(包括:發送請求的客戶端,代理服務器,等等)緩存。
private
表明響應只能被單個用戶緩存,不能作為共享緩存(即代理服務器不能緩存它),可以緩存響應內容。
no-cache
在釋放緩存副本之前,強制高速緩存將請求提交給原始服務器進行驗證。
only-if-cached
表明客戶端只接受已緩存的響應,並且不要向原始服務器檢查是否有更新的拷貝.

- 到期
max-age=<seconds>
設置緩存存儲的最大周期,超過這個時間緩存被認為過期(單位秒)。與Expires相反,時間是相對於請求的時間。
s-maxage=<seconds>
覆蓋max-age 或者 Expires 頭,但是僅適用於共享緩存(比如各個代理),並且私有緩存中它被忽略。
max-stale[=<seconds>]
表明客戶端願意接收一個已經過期的資源。 可選的設置一個時間(單位秒),表示響應不能超過的過時時間。
min-fresh=<seconds>
表示客戶端希望在指定的時間內獲取最新的響應。
stale-while-revalidate=<seconds>
表明客戶端願意接受陳舊的響應,同時在後臺異步檢查新的響應。秒值指示客戶願意接受陳舊響應的時間長度。
stale-if-error=<seconds>
表示如果新的檢查失敗,則客戶願意接受陳舊的響應。秒數值表示客戶在初始到期後願意接受陳舊響應的時間。

  

Nginx下關於緩存控制字段cache-control的配置說明