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


 

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文件訪問的頭部信息里的緩存時間設置! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM