HTTP 協(xié)議的 Cache -Control 指定請求和響應(yīng)遵循的緩存機制。在請求消息或響應(yīng)消息中設(shè)置 Cache-Control 并不會影響另一個消息處理過程中的緩存處理過程。
請求時的緩存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached 等。
響應(yīng)消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。
下面做一詳細總結(jié), 方便在以后的運維工作中理解和運用.
一. 瀏覽器中關(guān)于 Cache 的3屬性:
1. Cache-Control:
設(shè)置相對過期時間, max-age 指明以秒為單位的緩存時間. 若對靜態(tài)資源只緩存一次, 可以設(shè)置max-age 的值為315360000000 (一萬年). 比如對于提交的訂單,為了防止瀏覽器回退重新提交,可以使用 Cache-Control之no-store 絕對禁止緩存,即便瀏覽器回退依然請求的是服務(wù)器,進而判斷訂單的狀態(tài)給出相應(yīng)的提示信息!
Http 協(xié)議的 cache-control 的常見取值及其組合釋義:
no-cache: 數(shù)據(jù)內(nèi)容不能被緩存, 每次請求都重新訪問服務(wù)器, 若有 max-age, 則緩存期間不訪問服務(wù)器.
no-store: 不僅不能緩存, 連暫存也不可以(即: 臨時文件夾中不能暫存該資源).
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問服務(wù)器, 若有 max-age, 則緩存期間不訪問服務(wù)器.
public: 可以被任何緩存區(qū)緩存, 如: 瀏覽器、服務(wù)器、代理服務(wù)器等.
max-age: 相對過期時間, 即以秒為單位的緩存時間.
no-cache, private: 打開新窗口時候重新訪問服務(wù)器, 若設(shè)置 max-age, 則緩存期間不訪問服務(wù)器.
- private, 正數(shù)的 max-age: 后退時候不會訪問服務(wù)器.
- no-cache, 正數(shù)的 max-age: 后退時會訪問服務(wù)器.
2. Expires:
設(shè)置以分鐘為單位的絕對過期時間, 優(yōu)先級比 Cache-Control 低, 同時設(shè)置 Expires和Cache-Control 則后者生效. 也就是說要注意一點: Cache-Control 的優(yōu)先級高于 Expires
expires 起到控制頁面緩存的作用,合理配置 expires 可以減少很多服務(wù)器的請求, expires 的配置可以在 http 段中或者 server 段中或者 location 段中. 比如控制圖片等過期時間為30天, 可以配置如下:
location ~ .(gif|jpg|jpeg|png|bmp|ico)$ {
root /var/www/img/;
expires 30d;
}
再比如:
location ~ .(wma|wmv|asf|mp3|mmf|zip|rar|swf|flv)$ { root /var/www/upload/; expires max; }
3. Last-Modified:
該資源的最后修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發(fā)送一個請求到服務(wù)器上, 并附上 If-Unmodified-Since 頭來說明瀏覽器所緩存資源的最后修改時間, 如果服務(wù)器發(fā)現(xiàn)沒有修改, 則直接返回 304(Not Modified) 回應(yīng)信息給瀏覽器(內(nèi)容很少), 如果服務(wù)器對比時間發(fā)現(xiàn)修改了, 則照常返回所請求的資源.
需要注意:
1) Last-Modified 屬性通常和 Expires 或 Cache-Control 屬性配合使用, 因為即使瀏覽器設(shè)置緩存, 當(dāng)用戶點擊”刷新”按鈕時, 瀏覽器會忽略緩存繼續(xù)向服務(wù)器發(fā)送請求, 這時Last-Modified 將能夠很好的減小回應(yīng)開銷.
2) ETag 將返回給瀏覽器一個資源 ID, 如果有了新版本則正常發(fā)送并附上新 ID, 否則返回304, 但是在服務(wù)器集群情況下, 每個服務(wù)器將返回不同的 ID, 因此不建議使用 ETag.
以上描述的客戶端瀏覽器緩存是指存儲位置在客戶端瀏覽器, 但是對客戶端瀏覽器緩存的實際設(shè)置工作是在服務(wù)器上的資源中完成的. 雖然上面介紹了有關(guān)于客戶端瀏覽器緩存的屬性, 但是實際上對這些屬性的設(shè)置工作都需要在服務(wù)器的資源中做設(shè)置. 通常有兩種操作手段對瀏覽器緩存進行設(shè)置, 一個是通過頁面指令聲明來設(shè)置, 另外一個是通過編程方式來設(shè)置.
下面是相關(guān)頁面設(shè)置Cache-Control頭信息的幾個簡單配置:
例一:
if ($request_uri ~* "^/$|^/search/.+/|^/company/.+/") {
add_header Cache-Control max-age=3600;
}
個人理解的max-age意思是:客戶端本地的緩存,在配置的生存時間內(nèi)的,客戶端可以直接使用,超出生存時間的,到服務(wù)器上取新數(shù)據(jù)。當(dāng)然這些還要看客戶端瀏覽器的設(shè)置。
例二:
location ~ .*.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
例三:
location ~ .*.(js|css)$ { expires 10d; }
例四: 將 html 結(jié)尾的請求加上 no-cache
location / {
access_log /data/Nginx/log/xxx.log api;
root /home/www/html;
if ($request_filename ~ .*.(htm|html)$)
{
add_header Cache-Control no-cache;
}
}
二. http Headers 模塊 (設(shè)置 HTTP 報文的頭標)
Nginx 的 ngx_http_headers_module 模塊可以對 Cache-Control 頭相關(guān)的東西進行配置, 比如:
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
當(dāng) HTTP 應(yīng)答狀態(tài)碼為 200、204、301、302 或 304 的時候,增加指定的 HTTP 頭標。其中頭標的值可以使用變量。
expires
語法: expires [time|epoch|max|off
默認值: expires off
作用域: http, server, location
使用本指令可以控制HTTP應(yīng)答中的“Expires”和“Cache-Control”的頭標,(起到控制頁面緩存的作用)。
可以在time值中使用正數(shù)或負數(shù)。“Expires”頭標的值將通過當(dāng)前系統(tǒng)時間加上您設(shè)定的 time 值來獲得。
epoch
指定“Expires”的值為 1 January, 1970, 00:00:01 GMT。
max
指定“Expires”的值為 31 December 2037 23:59:59 GMT,“Cache-Control”的值為10年。
指定“Expires”的值為 服務(wù)器當(dāng)前時間 -1s,即永遠過期.
"Cache-Control"頭標的值由您指定的時間來決定:
- 負數(shù)
Cache-Control: no-cache
- 正數(shù)或零
Cache-Control: max-age = #
# 為您指定時間的秒數(shù)。
"off" 表示不修改“Expires”和“Cache-Control”的值;
三. Cache-Control
Cache-Control 通用消息頭字段被用于在http 請求和響應(yīng)中通過指定指令來實現(xiàn)緩存機制。緩存指令是單向的, 這意味著在請求設(shè)置的指令,在響應(yīng)中不一定包含相同的指令。
響應(yīng)頭:Cache-Control:no-cache,強制每次請求直接發(fā)送給源服務(wù)器,而不經(jīng)過本地緩存版本的校驗。這對于需要確認認證應(yīng)用很有用(可以和public結(jié)合使用),或者嚴格要求使用最新數(shù)據(jù) 的應(yīng)用(不惜犧牲使用緩存的所有好處). 通俗解釋:瀏覽器通知服務(wù)器,本地沒有緩存數(shù)據(jù).
cache-control :
max-age>0時 直接從游覽器緩存中提取;
max-age<=0 時向server發(fā)送http請求確認 ,該資源是否有修改, 有的話 返回200 , 無的話 返回304。
通俗解釋:響應(yīng)頭中的 Cache-Control:max-age=315360000 是通知瀏覽器: 315360000 秒之內(nèi)不要煩我, 就自己從緩沖區(qū)中刷新。
語法
指令不區(qū)分大小寫,并且具有可選參數(shù),可以用令牌或者帶引號的字符串語法。多個指令以逗號分隔。
指令
- 可緩存性
public
表明響應(yīng)可以被任何對象(包括:發(fā)送請求的客戶端,代理服務(wù)器,等等)緩存。表示相應(yīng)會被緩存,并且在多用戶間共享。默認是public。
private
表明響應(yīng)只能被單個用戶緩存,不能作為共享緩存(即代理服務(wù)器不能緩存它),可以緩存響應(yīng)內(nèi)容。響應(yīng)只作為私有的緩存,不能在用戶間共享。如果要求HTTP認證,響應(yīng)會自動設(shè)置為private。
no-cache
在釋放緩存副本之前,強制高速緩存將請求提交給原始服務(wù)器進行驗證。指定不緩存響應(yīng),表明資源不進行緩存。但是設(shè)置了no-cache之后并不代表瀏覽器不緩存,而是在緩存前要向服務(wù)器確認資源是否被更改。因此有的時候只設(shè)置no-cache防止緩存還是不夠保險,還可以加上private指令,將過期時間設(shè)為過去的時間。
only-if-cached
表明客戶端只接受已緩存的響應(yīng),并且不要向原始服務(wù)器檢查是否有更新的拷貝.
- 到期
max-age=<seconds>
設(shè)置緩存存儲的最大周期,超過這個時間緩存被認為過期(單位秒)。與Expires相反,時間是相對于請求的時間。max-age會覆蓋掉Expires。
s-maxage=<seconds>
覆蓋max-age 或者 Expires 頭,但是僅適用于共享緩存(比如各個代理),并且私有緩存中它被忽略。也就是說s-maxage只用于共享緩存,比如CDN緩存(s -> share)。與max-age 的區(qū)別是: max-age用于普通緩存,而s-maxage用于代理緩存。如果存在s-maxage,則會覆蓋max-age 和 Expires.
max-stale[=<seconds>]
表明客戶端愿意接收一個已經(jīng)過期的資源。 可選的設(shè)置一個時間(單位秒),表示響應(yīng)不能超過的過時時間。
min-fresh=<seconds>
表示客戶端希望在指定的時間內(nèi)獲取最新的響應(yīng)。
stale-while-revalidate=<seconds>
表明客戶端愿意接受陳舊的響應(yīng),同時在后臺異步檢查新的響應(yīng)。秒值指示客戶愿意接受陳舊響應(yīng)的時間長度。
stale-if-error=<seconds>
表示如果新的檢查失敗,則客戶愿意接受陳舊的響應(yīng)。秒數(shù)值表示客戶在初始到期后愿意接受陳舊響應(yīng)的時間。
- 重新驗證和重新加載
must-revalidate
緩存必須在使用之前驗證舊資源的狀態(tài),并且不可使用過期資源。表示如果頁面過期,則去服務(wù)器進行獲取。
proxy-revalidate
與must-revalidate作用相同,但它僅適用于共享緩存(例如代理),并被私有緩存忽略。
immutable
表示響應(yīng)正文不會隨時間而改變。資源(如果未過期)在服務(wù)器上不發(fā)生改變,因此客戶端不應(yīng)發(fā)送重新驗證請求頭(例如If-None-Match或If-Modified-Since)來檢查更新,即使用戶顯式地刷新頁面。在Firefox中,immutable只能被用在 https:// transactions.
- 其他
no-store
緩存不應(yīng)存儲有關(guān)客戶端請求或服務(wù)器響應(yīng)的任何內(nèi)容。表示絕對禁止緩存!
no-transform
不得對資源進行轉(zhuǎn)換或轉(zhuǎn)變。Content-Encoding, Content-Range, Content-Type等HTTP頭不能由代理修改。例如,非透明代理可以對圖像格式進行轉(zhuǎn)換,以便節(jié)省緩存空間或者減少緩慢鏈路上的流量。 no-transform指令不允許這樣做。
兩個小示例
- 禁止緩存
發(fā)送如下指令可以關(guān)閉緩存。此外,可以參考Expires 和 Pragma 標題。
Cache-Control: no-cache, no-store, must-revalidate
- 緩存靜態(tài)資源節(jié)
對于應(yīng)用程序中不會改變的文件,通常可以在發(fā)送響應(yīng)頭前添加積極緩存。這包括例如由應(yīng)用程序提供的靜態(tài)文件,例如圖像,CSS文件和JAVAScript文件。另請參閱Expires標題。
Cache-Control:public, max-age=31536000
這里擴展一下:
HTTP1.0
HTTP1.0 中通過 Pragma 控制頁面緩存,通常設(shè)置的值為 no- cache,不過這個值不這么保險,通常還加上 Expires 置為 0 來達到目的。但是如我們刻意需要瀏覽器或緩存服務(wù)器緩存住我們的頁面這個值則要設(shè)置為 Pragma。
HTTP1.1
HTTP1.1 中啟用 Cache-Control 來控制頁面的緩存與否,Cache-Control 是 http1.1 中的標準,可以看成是 expires 的補充, 使用的是相對時間的概念。注意幾個常用的參數(shù):
no-cache: 瀏覽器和緩存服務(wù)器都不應(yīng)該緩存頁面信息;
public: 瀏覽器和緩存服務(wù)器都可以緩存頁面信息;
no-store: 請求和響應(yīng)的信息都不應(yīng)該被存儲在對方的磁盤系統(tǒng)中;
must-revalidate: 對于客戶機的每次請求,代理服務(wù)器必須想服務(wù)器驗證緩存是否過時
目前Cache-Control 請求字段被各個瀏覽器支持的較好,其優(yōu)先級也比較高,當(dāng)和別的字段(如Expires)一起用時,會覆蓋其他字段。
四. nginx 配置管理瀏覽器靜態(tài)緩存策略
瀏覽器緩存: expires, cache-control, last-modified, etag. 先來看一張圖:

每個狀態(tài)的詳細說明如下:
1、Last-Modified
在瀏覽器第一次請求某一個 URL 時,服務(wù)器端的返回狀態(tài)會是200,內(nèi)容是你請求的資源,同時有一個 Last-Modified 的屬性標記 (HttpReponse Header) 此文件在服務(wù)期端最后被修改的時間,格式類似這樣:
Last-Modified:Tue, 24 Feb 2019 08:01:04 GMT
客戶端第二次請求此URL時,根據(jù)HTTP協(xié)議的規(guī)定,瀏覽器會向服務(wù)器傳送If-Modified-Since報頭(HttpRequest Header),詢問該時間之后文件是否有被修改過:
If-Modified-Since:Tue, 24 Feb 2019 08:01:04 GMT
如果服務(wù)器端的資源沒有變化,則自動返回 HTTP304(NotChanged.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。當(dāng)服務(wù)器端代碼發(fā)生改變或者重啟服務(wù)器時,則重新發(fā)出資源,返回和第一次請求時類似。從而保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時,客戶端能夠得到最新的資源。
注意: 如果 If-Modified-Since 的時間比服務(wù)器當(dāng)前時間(當(dāng)前的請求時間 request_time) 還晚,會認為是個非法請求
2、Etag 工作原理
HTTP 協(xié)議規(guī)格說明定義 ETag 為“被請求變量的實體標記”(參見14.19)。簡單點即服務(wù)器響應(yīng)時給請求 URL 標記,并在 HTTP 響應(yīng)頭中將其傳送到客戶端,類似服務(wù)器端返回的格式:
Etag:“5d8c72a5edda8d6a:3239″
客戶端的查詢更新格式是這樣的:
If-None-Match:“5d8c72a5edda8d6a:3239″
如果ETag沒改變,則返回狀態(tài) 304。即: 在客戶端發(fā)出請求后,HttpReponse Header 中包含Etag:“5d8c72a5edda8d6a:3239″
標識,等于告訴Client端,你拿到的這個的資源有表示 ID:5d8c72a5edda8d6a:3239。當(dāng)下次需要發(fā) Request 索要同一個 URI 的時候,瀏覽器同時發(fā)出一個 If-None-Match 報頭(Http RequestHeader) 此時包頭中信息包含上次訪問得到的 Etag:“5d8c72a5edda8d6a:3239″標識。
If-None-Match:“5d8c72a5edda8d6a:3239“
這樣,Client 端等于 Cache 了兩份,服務(wù)器端就會比對2者的 etag。如果 If-None-Match 為False,不返回 200,返回 304(Not Modified) Response。
3、Expires
給出的日期/時間后,被響應(yīng)認為是過時。如 Expires:Thu, 02 Apr 2009 05:14:08 GMT 需和Last-Modified 結(jié)合使用。用于控制請求文件的有效時間,當(dāng)請求數(shù)據(jù)在有效期內(nèi)時客戶端瀏覽器從緩存請求數(shù)據(jù)而不是服務(wù)器端.當(dāng)緩存中數(shù)據(jù)失效或過期,才決定從服務(wù)器更新數(shù)據(jù)。
4、Last-Modified和Expires
Last-Modified 標識能夠節(jié)省一點帶寬,但是還是逃不掉發(fā)一個 HTTP 請求出去,而且要和Expires一起用。而 Expires 標識卻使得瀏覽器干脆連 HTTP 請求都不用發(fā),比如當(dāng)用戶 F5 或者點擊 Refresh 按鈕的時候就算對于有 Expires 的 URI,一樣也會發(fā)一個 HTTP 請求出去,所以,Last-Modified 還是要用的,而且要和 Expires 一起用。
5、Etag和Expires
如果服務(wù)器端同時設(shè)置了 Etag 和 Expires 時,Etag 原理同樣,即與 Last-Modified/Etag 對應(yīng)的 HttpRequestHeader:If-Modified-Since 和 If-None-Match。我們可以看到這兩個 Header 的值和 WebServer 發(fā)出的 Last-Modified,Etag 值完全一樣;在完全匹配If-Modified-Since 和 If-None-Match 即檢查完修改時間和 Etag 之后,服務(wù)器才能返回304.
6、Last-Modified和Etag
分布式系統(tǒng)里多臺機器間文件的 last-modified 必須保持一致,以免負載均衡到不同機器導(dǎo)致比對失敗. 分布式系統(tǒng)盡量關(guān)閉掉 Etag(每臺機器生成的 etag 都會不一樣)
Last-Modified 和 ETags 請求的http報頭一起使用,服務(wù)器首先產(chǎn)生 Last-Modified/Etag 標記,服務(wù)器可在稍后使用它來判斷頁面是否已經(jīng)被修改,來決定文件是否繼續(xù)緩存
過程如下:
1) 客戶端請求一個頁面(A)。
2) 服務(wù)器返回頁面 A,并在給A加上一個 Last-Modified/ETag。
3) 客戶端展現(xiàn)該頁面,并將頁面連同 Last-Modified/ETag 一起緩存。
4) 客戶再次請求頁面 A,并將上次請求時服務(wù)器返回的 Last-Modified/ETag 一起傳遞給服務(wù)器。
5) 服務(wù)器檢查該 Last-Modified 或 ETag,并判斷出該頁面自上次客戶端請求之后還未被修改,直接返回響應(yīng) 304 和一個空的響應(yīng)體。
需要注意:
1) Last-Modified 和 Etag 頭都是由 WebServer 發(fā)出的 HttpReponse Header,WebServer 應(yīng)該同時支持這兩種頭。
2) WebServer 發(fā)送完 Last-Modified/Etag 頭給客戶端后,客戶端會緩存這些頭;
3) 客戶端再次發(fā)起相同頁面的請求時,將分別發(fā)送與 Last-Modified/Etag 對應(yīng)的HttpRequestHeader:If-Modified-Since和If-None-Match。我們可以看到這兩個 Header 的值和 WebServer 發(fā)出的 Last-Modified,Etag 值完全一樣;
4) 通過上述值到服務(wù)器端檢查,判斷文件是否繼續(xù)緩存;
7、關(guān)于 Cache-Control: max-age=秒 和 Expires
Expires = 時間,HTTP 1.0 版本,緩存的載止時間,允許客戶端在這個時間之前不去檢查(發(fā)請求)
max-age = 秒,HTTP 1.1 版本,資源在本地緩存多少秒。
如果 max-age 和 Expires 同時存在,則被 Cache-Control 的 max-age 覆蓋。
Expires 的一個缺點: 就是返回的到期時間是服務(wù)器端的時間,這樣存在一個問題,如果客戶端的時間與服務(wù)器的時間相差很大,那么誤差就很大,所以在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。
Expires =max-age + “每次下載時的當(dāng)前的request時間”
所以一旦重新下載的頁面后,expires就重新計算一次,但last-modified不會變化.
8、基于nginx 配置使用總結(jié)
分布式系統(tǒng)(有 ng-ha 和 應(yīng)用的負載均衡),最好使用 Last-Modified 和 Expires,把 Etag 關(guān)閉掉。
1) 關(guān)閉 etag
http {
etag off;
關(guān)閉 etag, 使用 Last-Modified 和 Expires
2) 配置 last-modified (默認開啟)和expires
location ~.*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~.*.(js|css)?$ { expires 12h; }
對于配置了多個 location(upstream) 的,可以:
location /filebase/ { root /hskj/file/; autoindex on; if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){ add_header Content-Disposition: 'attachment;'; } if ($request_filename ~* ^.*?.(gif|jpg|jpeg|png|bmp|swf)$){ expires 30d; } if ($request_filename ~* ^.*?.(js|css)$){ expires 12h; } }
效果如下:

這里順便看一個配置實例: nginx 設(shè)置不使用緩存 add_header Cache-Control no-cache
server { listen 443; server_name www.kevin.com; charset utf-8; ssl on; ssl_certificate /daka/program/nginx/conf/server.cer; ssl_certificate_key /daka/program/nginx/conf/server.key; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; #設(shè)置瀏覽器緩存 add_header Cache-Control no-cache; add_header Cache-Control private; location /yp { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8082/yp/yp; if ($request_filename ~* .*.(html|htm)$) { expires -1s; } if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; } if ($request_filename ~ .*.(js|css)$) { expires 12h; } } location /static { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8082/static; if ($request_filename ~* .*.(html|htm)$) { expires -1s; } if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; } if ($request_filename ~ .*.(js|css)$) { expires 12h; } } location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.0.221:8080/; # if (-e $request_filename){ # rewrite ^/$ https://www.kevin.com:443/invest/index.jhtml permanent; # } if ($request_filename ~* .*.(html|htm)$) { # expires -1s; } if ($request_filename ~* .*.(gif|jpg|jpeg|png|bmp|swf)$) { expires 30d; } if ($request_filename ~ .*.(js|css)$) { expires 12h; } } }
運維案例分享: Nginx 增加緩存控制字段 cache-control
開發(fā)發(fā)過來的需求:
1) 對于 html 文件,cache control 設(shè)置為 no-cache;
2) 對于 js,圖片,css,字體等,設(shè)置 max-age=2592000. 也就是30天;
注意點:
- 緩存控制字段 cache-control 的配置 (add_header) 要放在 http, server, location 區(qū)域, 或是放在 location 的 if 判斷里, 例如"add_header Cache-Control no-cache;".
- 如果前面有 LB 負載代理層, 則緩存控制字段 cache-control 配置要放在后端的真實服務(wù)器 nginx 的 location 區(qū)域, 并且要指定 root 根路徑, 否則訪問會出現(xiàn) 404 (即找不到訪問路徑);
針對上面的案例需求, 操作記錄如下:
1) 本案中在實際場景中, 有 LB 層. LB 層的 nginx 配置不需要配置, 這里只是粘貼下負載配置:
[root@fvtlb01 ~]# cat /data/nginx/conf/vhosts/fvtkevin-web.veredholdings-inc.com.conf upstream fvtkevin-web-inc { ip_hash; server 172.16.50.73:80 max_fails=3 fail_timeout=15s; server 172.16.50.74:80 max_fails=3 fail_timeout=15s; } server { listen 80; server_name fvtkevin-web.veredholdings-inc.com; access_log /data/nginx/logs/fvtkevin-web.veredholdings-inc.com-access.log main; error_log /data/nginx/logs/fvtkevin-web.veredholdings-inc.com-error.log; location / { proxy_pass http://fvtkevin-web-inc; proxy_redirect off ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 600; proxy_buffer_size 256k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404; proxy_max_temp_file_size 128m; #proxy_cache mycache; #proxy_cache_valid 200 302 1h; #proxy_cache_valid 301 1d; #proxy_cache_valid any 1m; } }
2) 緩存控制字段 cache-control 的配置要放在后端兩臺真實服務(wù)器 172.16.50.73 和172.16.50.74上.
a) 172.16.60.73 (即 fvtkevin-dmz01.veredholdings.cn)服務(wù)器上緩存控制字段 cache-control 的配置如下:
[root@fvtkevin-dmz01 ~]# cat /data/nginx/conf/vhosts/fvtkevin-web01.veredholdings.cn.conf server { listen 80; server_name fvtkevin-dmz01.veredholdings.cn; access_log /data/nginx/logs/fvtkevin-dmz01.veredholdings.cn-access.log main; error_log /data/nginx/logs/fvtkevin-dmz01.veredholdings.cn-error.log; location / { root /data/web/kevin; index index.php index.html index.htm; } location ~ .(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ { root /data/web/kevin; expires 30d; } location ~ .(html|htm)$ { root /data/web/kevin; add_header Cache-Control no-cache; } location /document/ { alias /data/web/document/; } location ~ .(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ { root /data/web/document; expires 30d; } location ~ .(html|htm)$ { root /data/web/document; add_header Cache-Control no-cache; } }
b) 172.16.60.74 (即 fvtkevin-dmz02.veredholdings.cn)服務(wù)器上緩存控制字段 cache-control 的配置如下:
[root@fvtkevin-dmz02 ~]# cat /data/nginx/conf/vhosts/fvtkevin-web02.veredholdings.cn.conf server { listen 80; server_name fvtkevin-web02.veredholdings.cn; access_log /data/nginx/logs/fvtkevin-web02.veredholdings.cn-access.log main; error_log /data/nginx/logs/fvtkevin-web02.veredholdings.cn-error.log; location / { root /data/web/kevin; index index.php index.html index.htm; } location ~ .(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ { root /data/web/kevin; expires 30d; } location ~ .(html|htm)$ { root /data/web/kevin; add_header Cache-Control no-cache; } location /document/ { alias /data/web/document/; } location ~ .(css|js|gif|jpg|jpeg|png|bmp|swf|ttf|woff|otf|ttc|pfa)$ { root /data/web/document; expires 30d; } location ~ .(html|htm)$ { root /data/web/document; add_header Cache-Control no-cache; } }
以上配置中, 關(guān)于緩存控制字段 cache-control 的配置主要有兩個:
1) http://fvtkevin-web.veredholdings-inc.com/ 下:
對于 html, html 格式的文件,cache control 設(shè)置為 no-cache;
對于js,圖片,css,字體等,設(shè)置 max-age=2592000;
這是基于 /data/web/kevin 的 root 根目錄下的
2) http://fvtkevin-web.veredholdings-inc.com/document 下:
對于 html, html 格式的文件,cache control 設(shè)置為 no-cache;
對于js,圖片,css,字體等,設(shè)置 max-age=2592000;
這是基于 /data/web/document 的 root 根目錄下的
以上配置后, 訪問 http://fvtkevin-web.veredholdings-inc.com/ 或者 http://fvtkevin-web.veredholdings-inc.com/document 進行驗證. 這里驗證下 http://fvtkevin-web.veredholdings-inc.com/, 效果如下:

上面顯示了 http://fvtkevin-web.veredholdings-inc.com/ 首頁(即 index.html 文件)訪問頭部信息里有"no-cache"信息!

上面顯示了http://fvtkevin-web.veredholdings-inc.com/*.js文件訪問的頭部信息里的緩存時間設(shè)置!
當(dāng)你發(fā)現(xiàn)自己的才華撐不起野心時,就請安靜下來學(xué)習(xí)吧!
作者:散盡浮華
出處:http://1t.click/aJqG