Nginx下關於快取控制欄位cache-control的配置說明 - 運維小結

散盡浮華發表於2019-03-02

 

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年。

-1

指定“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>]
     表明客戶端願意接收一個已經過期的資源。 可選的設定一個時間(單位秒),表示響應不能超過的過時時間。
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配置管理瀏覽器靜態快取策略
瀏覽器快取: expirescache-control last-modifiedetag.   先來看一張圖:

每個狀態的詳細說明如下:
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檔案訪問的頭部資訊裡的快取時間設定! 

相關文章