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 (一萬年). 比如對於提交的訂單,為了防止瀏覽器回退重新提交,可以使用 Cache-Control之no-store 絕對禁止緩存,即便瀏覽器回退依然請求的是服務器,進而判斷訂單的狀態給出相應的提示信息!
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 則後者生效. 也就是說要注意一點: Cache-Control 的優先級高於 Expires
expires 起到控制頁面緩存的作用,合理配置 expires 可以減少很多服務器的請求, 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:
該資源的最後修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發送一個請求到服務器上, 並附上 If-Unmodified-Since 頭來說明瀏覽器所緩存資源的最後修改時間, 如果服務器發現沒有修改, 則直接返回 304(Not Modified) 回應信息給瀏覽器(內容很少), 如果服務器對比時間發現修改了, 則照常返回所請求的資源.
需要注意:
1) Last-Modified 屬性通常和 Expires 或 Cache-Control 屬性配合使用, 因為即使瀏覽器設置緩存, 當用戶點擊”刷新”按鈕時, 瀏覽器會忽略緩存繼續向服務器發送請求, 這時Last-Modified 將能夠很好的減小回應開銷.
2) ETag 將返回給瀏覽器一個資源 ID, 如果有了新版本則正常發送並附上新 ID, 否則返回304, 但是在服務器集群情況下, 每個服務器將返回不同的 ID, 因此不建議使用 ETag.
以上描述的客戶端瀏覽器緩存是指存儲位置在客戶端瀏覽器, 但是對客戶端瀏覽器緩存的實際設置工作是在服務器上的資源中完成的. 雖然上面介紹了有關於客戶端瀏覽器緩存的屬性, 但是實際上對這些屬性的設置工作都需要在服務器的資源中做設置. 通常有兩種操作手段對瀏覽器緩存進行設置, 一個是通過頁面指令聲明來設置, 另外一個是通過編程方式來設置.
下面是相關頁面設置Cache-Control頭信息的幾個簡單配置:
例一:
if ($request_uri ~* "^/$|^/search/.+/|^/company/.+/") {
add_header Cache-Control max-age=3600;
}
個人理解的max-age意思是:客戶端本地的緩存,在配置的生存時間內的,客戶端可以直接使用,超出生存時間的,到服務器上取新數據。當然這些還要看客戶端瀏覽器的設置。
例二:
location ~ .*\\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
例三:
location ~ .*\\.(js|css)$ {
expires 10d;
}
例四: 將 html 結尾的請求加上 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 模塊 (設置 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年。
指定“Expires”的值為 服務器當前時間 -1s,即永遠過期.
"Cache-Control"頭標的值由您指定的時間來決定:
- 負數
Cache-Control: no-cache
- 正數或零
Cache-Control: max-age = #
# 為您指定時間的秒數。
"off" 表示不修改“Expires”和“Cache-Control”的值;
三. Cache-Control
Cache-Control 通用消息頭字段被用於在http 請求和響應中通過指定指令來實現緩存機制。緩存指令是單向的, 這意味著在請求設置的指令,在響應中不一定包含相同的指令。
響應頭:Cache-Control:no-cache,強制每次請求直接發送給源服務器,而不經過本地緩存版本的校驗。這對於需要確認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新數據 的應用(不惜犧牲使用緩存的所有好處). 通俗解釋:瀏覽器通知服務器,本地沒有緩存數據.
cache-control :
max-age>0時 直接從遊覽器緩存中提取;
max-age<=0 時向server發送http請求確認 ,該資源是否有修改, 有的話 返回200 , 無的話 返回304。
通俗解釋:響應頭中的 Cache-Control:max-age=315360000 是通知瀏覽器: 315360000 秒之內不要煩我, 就自己從緩衝區中刷新。
語法
指令不區分大小寫,並且具有可選參數,可以用令牌或者帶引號的字符串語法。多個指令以逗號分隔。
指令
- 可緩存性
public
表明響應可以被任何對象(包括:發送請求的客戶端,代理服務器,等等)緩存。表示相應會被緩存,並且在多用戶間共享。默認是public。
private
表明響應只能被單個用戶緩存,不能作為共享緩存(即代理服務器不能緩存它),可以緩存響應內容。響應只作為私有的緩存,不能在用戶間共享。如果要求HTTP認證,響應會自動設置為private。
no-cache
在釋放緩存副本之前,強制高速緩存將請求提交給原始服務器進行驗證。指定不緩存響應,表明資源不進行緩存。但是設置了no-cache之後並不代表瀏覽器不緩存,而是在緩存前要向服務器確認資源是否被更改。因此有的時候只設置no-cache防止緩存還是不夠保險,還可以加上private指令,將過期時間設為過去的時間。
only-if-cached
表明客戶端只接受已緩存的響應,並且不要向原始服務器檢查是否有更新的拷貝.
- 到期
max-age=<seconds>
設置緩存存儲的最大週期,超過這個時間緩存被認為過期(單位秒)。與Expires相反,時間是相對於請求的時間。max-age會覆蓋掉Expires。
s-maxage=<seconds>
覆蓋max-age 或者 Expires 頭,但是僅適用於共享緩存(比如各個代理),並且私有緩存中它被忽略。也就是說s-maxage只用於共享緩存,比如CDN緩存(s -> share)。與max-age 的區別是: max-age用於普通緩存,而s-maxage用於代理緩存。如果存在s-maxage,則會覆蓋max-age 和 Expires.
max-stale[=<seconds>]/<seconds>
表明客戶端願意接收一個已經過期的資源。 可選的設置一個時間(單位秒),表示響應不能超過的過時時間。
min-fresh=<seconds>
表示客戶端希望在指定的時間內獲取最新的響應。
stale-while-revalidate=<seconds>
表明客戶端願意接受陳舊的響應,同時在後臺異步檢查新的響應。秒值指示客戶願意接受陳舊響應的時間長度。
stale-if-error=<seconds>
表示如果新的檢查失敗,則客戶願意接受陳舊的響應。秒數值表示客戶在初始到期後願意接受陳舊響應的時間。
- 重新驗證和重新加載
must-revalidate
緩存必須在使用之前驗證舊資源的狀態,並且不可使用過期資源。表示如果頁面過期,則去服務器進行獲取。
proxy-revalidate
與must-revalidate作用相同,但它僅適用於共享緩存(例如代理),並被私有緩存忽略。
immutable
表示響應正文不會隨時間而改變。資源(如果未過期)在服務器上不發生改變,因此客戶端不應發送重新驗證請求頭(例如If-None-Match或If-Modified-Since)來檢查更新,即使用戶顯式地刷新頁面。在Firefox中,immutable只能被用在 https:// transactions.
- 其他
no-store
緩存不應存儲有關客戶端請求或服務器響應的任何內容。表示絕對禁止緩存!
no-transform
不得對資源進行轉換或轉變。Content-Encoding, Content-Range, Content-Type等HTTP頭不能由代理修改。例如,非透明代理可以對圖像格式進行轉換,以便節省緩存空間或者減少緩慢鏈路上的流量。 no-transform指令不允許這樣做。
兩個小示例
- 禁止緩存
發送如下指令可以關閉緩存。此外,可以參考Expires 和 Pragma 標題。
Cache-Control: no-cache, no-store, must-revalidate
- 緩存靜態資源節
對於應用程序中不會改變的文件,通常可以在發送響應頭前添加積極緩存。這包括例如由應用程序提供的靜態文件,例如圖像,CSS文件和JavaScript文件。另請參閱Expires標題。
Cache-Control:public, max-age=31536000
這裡擴展一下:
HTTP1.0
HTTP1.0 中通過 Pragma 控制頁面緩存,通常設置的值為 no- cache,不過這個值不這麼保險,通常還加上 Expires 置為 0 來達到目的。但是如我們刻意需要瀏覽器或緩存服務器緩存住我們的頁面這個值則要設置為 Pragma。
HTTP1.1
HTTP1.1 中啟用 Cache-Control 來控制頁面的緩存與否,Cache-Control 是 http1.1 中的標準,可以看成是 expires 的補充, 使用的是相對時間的概念。注意幾個常用的參數:
no-cache: 瀏覽器和緩存服務器都不應該緩存頁面信息;
public: 瀏覽器和緩存服務器都可以緩存頁面信息;
no-store: 請求和響應的信息都不應該被存儲在對方的磁盤系統中;
must-revalidate: 對於客戶機的每次請求,代理服務器必須想服務器驗證緩存是否過時
目前Cache-Control 請求字段被各個瀏覽器支持的較好,其優先級也比較高,當和別的字段(如Expires)一起用時,會覆蓋其他字段。
四. nginx 配置管理瀏覽器靜態緩存策略
瀏覽器緩存: expires, cache-control, last-modified, etag. 先來看一張圖:
每個狀態的詳細說明如下:
1、Last-Modified
在瀏覽器第一次請求某一個 URL 時,服務器端的返回狀態會是200,內容是你請求的資源,同時有一個 Last-Modified 的屬性標記 (HttpReponse Header) 此文件在服務期端最後被修改的時間,格式類似這樣:
Last-Modified:Tue, 24 Feb 2019 08:01:04 GMT
客戶端第二次請求此URL時,根據HTTP協議的規定,瀏覽器會向服務器傳送If-Modified-Since報頭(HttpRequest Header),詢問該時間之後文件是否有被修改過:
If-Modified-Since:Tue, 24 Feb 2019 08:01:04 GMT
如果服務器端的資源沒有變化,則自動返回 HTTP304(NotChanged.)狀態碼,內容為空,這樣就節省了傳輸數據量。當服務器端代碼發生改變或者重啟服務器時,則重新發出資源,返回和第一次請求時類似。從而保證不向客戶端重複發出資源,也保證當服務器有變化時,客戶端能夠得到最新的資源。
注意: 如果 If-Modified-Since 的時間比服務器當前時間(當前的請求時間 request_time) 還晚,會認為是個非法請求
2、Etag 工作原理
HTTP 協議規格說明定義 ETag 為“被請求變量的實體標記”(參見14.19)。簡單點即服務器響應時給請求 URL 標記,並在 HTTP 響應頭中將其傳送到客戶端,類似服務器端返回的格式:
Etag:“5d8c72a5edda8d6a:3239″
客戶端的查詢更新格式是這樣的:
If-None-Match:“5d8c72a5edda8d6a:3239″
如果ETag沒改變,則返回狀態 304。即: 在客戶端發出請求後,HttpReponse Header 中包含Etag:“5d8c72a5edda8d6a:3239″
標識,等於告訴Client端,你拿到的這個的資源有表示 ID:5d8c72a5edda8d6a:3239。當下次需要發 Request 索要同一個 URI 的時候,瀏覽器同時發出一個 If-None-Match 報頭(Http RequestHeader) 此時包頭中信息包含上次訪問得到的 Etag:“5d8c72a5edda8d6a:3239″標識。
If-None-Match:“5d8c72a5edda8d6a:3239“
這樣,Client 端等於 Cache 了兩份,服務器端就會比對2者的 etag。如果 If-None-Match 為False,不返回 200,返回 304(Not Modified) Response。
3、Expires
給出的日期/時間後,被響應認為是過時。如 Expires:Thu, 02 Apr 2009 05:14:08 GMT 需和Last-Modified 結合使用。用於控制請求文件的有效時間,當請求數據在有效期內時客戶端瀏覽器從緩存請求數據而不是服務器端.當緩存中數據失效或過期,才決定從服務器更新數據。
4、Last-Modified和Expires
Last-Modified 標識能夠節省一點帶寬,但是還是逃不掉髮一個 HTTP 請求出去,而且要和Expires一起用。而 Expires 標識卻使得瀏覽器乾脆連 HTTP 請求都不用發,比如當用戶 F5 或者點擊 Refresh 按鈕的時候就算對於有 Expires 的 URI,一樣也會發一個 HTTP 請求出去,所以,Last-Modified 還是要用的,而且要和 Expires 一起用。
5、Etag和Expires
如果服務器端同時設置了 Etag 和 Expires 時,Etag 原理同樣,即與 Last-Modified/Etag 對應的 HttpRequestHeader:If-Modified-Since 和 If-None-Match。我們可以看到這兩個 Header 的值和 WebServer 發出的 Last-Modified,Etag 值完全一樣;在完全匹配If-Modified-Since 和 If-None-Match 即檢查完修改時間和 Etag 之後,服務器才能返回304.
6、Last-Modified和Etag
分佈式系統裡多臺機器間文件的 last-modified 必須保持一致,以免負載均衡到不同機器導致比對失敗. 分佈式系統儘量關閉掉 Etag(每臺機器生成的 etag 都會不一樣)
Last-Modified 和 ETags 請求的http報頭一起使用,服務器首先產生 Last-Modified/Etag 標記,服務器可在稍後使用它來判斷頁面是否已經被修改,來決定文件是否繼續緩存
過程如下:
1) 客戶端請求一個頁面(A)。
2) 服務器返回頁面 A,並在給A加上一個 Last-Modified/ETag。
3) 客戶端展現該頁面,並將頁面連同 Last-Modified/ETag 一起緩存。
4) 客戶再次請求頁面 A,並將上次請求時服務器返回的 Last-Modified/ETag 一起傳遞給服務器。
5) 服務器檢查該 Last-Modified 或 ETag,並判斷出該頁面自上次客戶端請求之後還未被修改,直接返回響應 304 和一個空的響應體。
需要注意:
1) Last-Modified 和 Etag 頭都是由 WebServer 發出的 HttpReponse Header,WebServer 應該同時支持這兩種頭。
2) WebServer 發送完 Last-Modified/Etag 頭給客戶端後,客戶端會緩存這些頭;
3) 客戶端再次發起相同頁面的請求時,將分別發送與 Last-Modified/Etag 對應的HttpRequestHeader:If-Modified-Since和If-None-Match。我們可以看到這兩個 Header 的值和 WebServer 發出的 Last-Modified,Etag 值完全一樣;
4) 通過上述值到服務器端檢查,判斷文件是否繼續緩存;
7、關於 Cache-Control: max-age=秒 和 Expires
Expires = 時間,HTTP 1.0 版本,緩存的載止時間,允許客戶端在這個時間之前不去檢查(發請求)
max-age = 秒,HTTP 1.1 版本,資源在本地緩存多少秒。
如果 max-age 和 Expires 同時存在,則被 Cache-Control 的 max-age 覆蓋。
Expires 的一個缺點: 就是返回的到期時間是服務器端的時間,這樣存在一個問題,如果客戶端的時間與服務器的時間相差很大,那麼誤差就很大,所以在HTTP 1.1版開始,使用Cache-Control: max-age=秒替代。
Expires =max-age + “每次下載時的當前的request時間”
所以一旦重新下載的頁面後,expires就重新計算一次,但last-modified不會變化.
8、基於nginx 配置使用總結
分佈式系統(有 ng-ha 和 應用的負載均衡),最好使用 Last-Modified 和 Expires,把 Etag 關閉掉。
1) 關閉 etag
http {
etag off;
關閉 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 設置不使用緩存 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;
#設置瀏覽器緩存
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
開發發過來的需求:
1) 對於 html 文件,cache control 設置為 no-cache;
2) 對於 js,圖片,css,字體等,設置 max-age=2592000. 也就是30天;
注意點:
- 緩存控制字段 cache-control 的配置 (add_header) 要放在 http, server, location 區域, 或是放在 location 的 if 判斷裡, 例如"add_header Cache-Control no-cache;".
- 如果前面有 LB 負載代理層, 則緩存控制字段 cache-control 配置要放在後端的真實服務器 nginx 的 location 區域, 並且要指定 root 根路徑, 否則訪問會出現 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 的配置要放在後端兩臺真實服務器 172.16.50.73 和172.16.50.74上.
a) 172.16.60.73 (即 fvtkevin-dmz01.veredholdings.cn)服務器上緩存控制字段 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)服務器上緩存控制字段 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;
}
}
以上配置中, 關於緩存控制字段 cache-control 的配置主要有兩個:
1) http://fvtkevin-web.veredholdings-inc.com/ 下:
對於 html, html 格式的文件,cache control 設置為 no-cache;
對於js,圖片,css,字體等,設置 max-age=2592000;
這是基於 /data/web/kevin 的 root 根目錄下的
2) http://fvtkevin-web.veredholdings-inc.com/document 下:
對於 html, html 格式的文件,cache control 設置為 no-cache;
對於js,圖片,css,字體等,設置 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文件訪問的頭部信息裡的緩存時間設置!
當你發現自己的才華撐不起野心時,就請安靜下來學習吧!
出處:http://1t.click/aJqG
真的忍不住想吐槽一下頭條的代碼塊功能,太差了,灰撲撲的一片還默認左對齊。
閱讀更多 Python學習 的文章