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屬性:
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: 後退時會通路伺服器
點選重新整理: 無論如何都會通路伺服器.
Expires:
設定以分鐘為機關的絕對過期時間, 優先級比Cache-Control低, 同時設定Expires和Cache-Control則後者生效.
Last-Modified:
該資源的最後修改時間, 在浏覽器下一次請求資源時, 浏覽器将先發送一個請求到伺服器上, 并附上If-Unmodified-Since頭來說明浏覽器所緩存資源的最後修改時間, 如果伺服器發現沒有修改, 則直接傳回304(Not Modified)回應資訊給浏覽器(内容很少), 如果伺服器對比時間發現修改了, 則照常傳回所請求的資源.
注意:
Last-Modified屬性通常和Expires或Cache-Control屬性配合使用, 因為即使浏覽器設定緩存, 當使用者點選”重新整理”按鈕時, 浏覽器會忽略緩存繼續向伺服器發送請求, 這時Last-Modified将能夠很好的減小回應開銷.
ETag将傳回給浏覽器一個資源ID, 如果有了新版本則正常發送并附上新ID, 否則傳回304, 但是在伺服器叢集情況下, 每個伺服器将傳回不同的ID, 是以不建議使用ETag.
以上描述的用戶端浏覽器緩存是指存儲位置在用戶端浏覽器, 但是對用戶端浏覽器緩存的實際設定工作是在伺服器上的資源中完成的. 雖然剛才我們介紹了有關于用戶端浏覽器緩存的屬性, 但是實際上對這些屬性的設定工作都需要在伺服器的資源中做設定. 我們有兩種操作手段對浏覽器緩存進行設定, 一個是通過頁面指令聲明來設定, 另外一個是通過程式設計方式來設定.
Nginx的ngx_http_headers_module子產品可以對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;
}
參考文檔:
http://zhidao.baidu.com/link?url=rr7aH9tLx2-PyfPMxp-PnRDa-RYRNSzhapmOgViBhkBAICEaNqbQV5QumAvNLUPKSbRD0I5_d0HwYRp134f-s6T8Ruqhb5W3hmQ3liPnDyu
location ~ .*\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
例三:
location ~ .*\.(js|css)$ {
expires 10d;
}