nginx expires控制頁面緩存
更新時間:2013年01月12日 16:12:31 作者:
expires 指令可以控制 HTTP 應(yīng)答中的“Expires ”和“ Cache-Control ”的頭標(起到控制頁面緩存的作用)
語法:expires [time|epoch|max|pff]默認值:offexpires指令控制HTTP應(yīng)答中的“Expires”和“Cache-Control”Header頭部信息,啟動控制頁面緩存的作用time:可以使用正數(shù)或負數(shù)?!癊xpires”頭標的值將通過當前系統(tǒng)時間加上設(shè)定time值來設(shè)定。time值還控制"Cache-Control"的值:負數(shù)表示no-cache正數(shù)或零表示max-age=time epoch:指定“Expires”的值為 1January,1970,00:00:01 GMTmax:指定“Expires”的值為31December2037 23:59:59GMT,"Cache-Control"的值為10年。-1:指定“Expires”的值為當前服務(wù)器時間-1s,即永遠過期。off:不修改“Expires”和"Cache-Control"的值
expires使用了特定的時間,并且要求服務(wù)器和客戶端的是中嚴格同步。
而Cache-Control是用max-age指令指定組件被緩存多久。
對于不支持http1.1的瀏覽器,還是需要expires來控制。所以最好能指定兩個響應(yīng)頭。但HTTP規(guī)范規(guī)定max-age指令將重寫expires頭。
如果不想讓代理或瀏覽器緩存,加no-cache參數(shù)或private參數(shù):
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
這樣瀏覽器F5刷新時,返回的依然是200,而不是304.
記錄一個nginx控制緩存的例子:
expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
if ( !-e $request_filename) {
rewrite ^(.*) http://test.zhaopin.com/index.html break;
# add_header Cache-Control no-cache;
# add_header Cache-Control private;
當我將add_header寫在rewrite之后時,發(fā)現(xiàn)add_header竟然不起作用了。。是因為寫進了if里面..
apache的mod_expires模塊使得在使用expires頭時能像max-age那樣以相對的方式設(shè)置日期,通過ExpiresDefault指令完成。例如:圖片等過期時間為請求開始的10年之后
<FileMatch"\.(gif|jpg|js|css)$">
ExpiresDefault "access plus 10years"
</FileMatch>
它像響應(yīng)中發(fā)送Expires頭和Cache-Control max-age頭。
expires|etag控制頁面緩存區(qū)別expires:像上面文章提到的:expires指令控制HTTP應(yīng)答中的“Expires”和“Cache-Control”Header頭部信息,啟動控制頁面緩存的作用time:可以使用正數(shù)或負數(shù)。“Expires”頭標的值將通過當前系統(tǒng)時間加上設(shè)定time值來設(shè)定。time值還控制"Cache-Control"的值:負數(shù)表示no-cache正數(shù)或零表示max-age=time epoch:指定“Expires”的值為 1January,1970,00:00:01 GMTmax:指定“Expires”的值為31December203723:59:59GMT,"Cache-Control"的值為10年。-1:指定“Expires”的值為當前服務(wù)器時間-1s,即永遠過期。off:不修改“Expires”和"Cache-Control"的值
expires使用了特定的時間,并且要求服務(wù)器和客戶端的是中嚴格同步。
而Cache-Control是用max-age指令指定組件被緩存多久。
對于不支持http1.1的瀏覽器,還是需要expires來控制。所以最好能指定兩個響應(yīng)頭。但HTTP規(guī)范規(guī)定max-age指令將重寫expires頭。一般用于頁面變化不是很快的時候,如果緩存過期了,瀏覽器在重用它之前會首先確認他是否有效,就是一個“條件GET請求”,如果有效,返回304狀態(tài)碼。expires通過Last-Modified響應(yīng)頭來確定。如圖:
第一次訪問:
請求:

返回:

第二次訪問:
請求:

返回:

這時返回的狀態(tài)碼是304,而在請求中比第一次多了If-Modified-Since頭,和原始服務(wù)器中的Last-Modified制作比較,所以實現(xiàn)瀏覽器緩存并判斷是否過期。
簡單的說,Last-Modified 與If-Modified-Since 都是用于記錄頁面最后修改時間的 HTTP 頭信息,只是Last-Modified 是由服務(wù)器往客戶端發(fā)送的 HTTP 頭,而 If-Modified-Since則是由客戶端往服務(wù)器發(fā)送的頭,可以看到,再次請求本地存在的 cache 頁面時,客戶端會通過 If-Modified-Since頭將先前服務(wù)器端發(fā)過來的 Last-Modified最后修改時間戳發(fā)送回去,這是為了讓服務(wù)器端進行驗證,通過這個時間戳判斷客戶端的頁面是否是最新的,如果不是最新的,則返回新的內(nèi)容,如果是最新的,則返回304告訴客戶端其本地cache的頁面是最新的,于是客戶端就可以直接從本地加載頁面了,這樣在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)就會大大減少,同時也減輕了服務(wù)器的負擔。
如果不想讓代理或瀏覽器緩存,加no-cache參數(shù)或private參數(shù):
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;

etag:實體標簽,是用來確認web服務(wù)器和瀏覽器緩存有效性的一種機制。原始服務(wù)器使用ETag響應(yīng)頭來指定組件的ETag瀏覽器通過If-None-Match頭將ETag傳回原始服務(wù)器。如果匹配,返回304
如圖:
第一次訪問:
請求:

返回:

第二次請求:

返回:

依然返回的狀態(tài)碼是304,而在請求中比第一次多了If-None-Match頭。所以實現(xiàn)瀏覽器緩存。如果這個值對不上,則緩存過期。
ETags和If-None-Match是一種常用的判斷資源是否改變的方法。類似于Last-Modified和HTTP-If-Modified-Since。但是有所不同的是Last-Modified和HTTP-If-Modified-Since只判斷資源的最后修改時間,而ETags和If-None-Match可以是資源任何的任何屬性。
ETags和If-None-Match的工作原理是在HTTPResponse中添加ETags信息。當客戶端再次請求該資源時,將在HTTPRequest中加入If-None-Match信息(ETags的值)。如果服務(wù)器驗證資源的ETags沒有改變(該資源沒有改變),將返回一個304狀態(tài);否則,服務(wù)器將返回200狀態(tài),并返回該資源和新的ETags。
IIS上的ETag格式需要修改。
另一篇文章講解的也非常清楚: http://www.fzitv.net/article/33214.htm
expires使用了特定的時間,并且要求服務(wù)器和客戶端的是中嚴格同步。
而Cache-Control是用max-age指令指定組件被緩存多久。
對于不支持http1.1的瀏覽器,還是需要expires來控制。所以最好能指定兩個響應(yīng)頭。但HTTP規(guī)范規(guī)定max-age指令將重寫expires頭。
如果不想讓代理或瀏覽器緩存,加no-cache參數(shù)或private參數(shù):
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
這樣瀏覽器F5刷新時,返回的依然是200,而不是304.
記錄一個nginx控制緩存的例子:
expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;
if ( !-e $request_filename) {
rewrite ^(.*) http://test.zhaopin.com/index.html break;
# add_header Cache-Control no-cache;
# add_header Cache-Control private;
當我將add_header寫在rewrite之后時,發(fā)現(xiàn)add_header竟然不起作用了。。是因為寫進了if里面..
apache的mod_expires模塊使得在使用expires頭時能像max-age那樣以相對的方式設(shè)置日期,通過ExpiresDefault指令完成。例如:圖片等過期時間為請求開始的10年之后
<FileMatch"\.(gif|jpg|js|css)$">
ExpiresDefault "access plus 10years"
</FileMatch>
它像響應(yīng)中發(fā)送Expires頭和Cache-Control max-age頭。
expires|etag控制頁面緩存區(qū)別expires:像上面文章提到的:expires指令控制HTTP應(yīng)答中的“Expires”和“Cache-Control”Header頭部信息,啟動控制頁面緩存的作用time:可以使用正數(shù)或負數(shù)。“Expires”頭標的值將通過當前系統(tǒng)時間加上設(shè)定time值來設(shè)定。time值還控制"Cache-Control"的值:負數(shù)表示no-cache正數(shù)或零表示max-age=time epoch:指定“Expires”的值為 1January,1970,00:00:01 GMTmax:指定“Expires”的值為31December203723:59:59GMT,"Cache-Control"的值為10年。-1:指定“Expires”的值為當前服務(wù)器時間-1s,即永遠過期。off:不修改“Expires”和"Cache-Control"的值
expires使用了特定的時間,并且要求服務(wù)器和客戶端的是中嚴格同步。
而Cache-Control是用max-age指令指定組件被緩存多久。
對于不支持http1.1的瀏覽器,還是需要expires來控制。所以最好能指定兩個響應(yīng)頭。但HTTP規(guī)范規(guī)定max-age指令將重寫expires頭。一般用于頁面變化不是很快的時候,如果緩存過期了,瀏覽器在重用它之前會首先確認他是否有效,就是一個“條件GET請求”,如果有效,返回304狀態(tài)碼。expires通過Last-Modified響應(yīng)頭來確定。如圖:
第一次訪問:
請求:

返回:

第二次訪問:
請求:

返回:

這時返回的狀態(tài)碼是304,而在請求中比第一次多了If-Modified-Since頭,和原始服務(wù)器中的Last-Modified制作比較,所以實現(xiàn)瀏覽器緩存并判斷是否過期。
簡單的說,Last-Modified 與If-Modified-Since 都是用于記錄頁面最后修改時間的 HTTP 頭信息,只是Last-Modified 是由服務(wù)器往客戶端發(fā)送的 HTTP 頭,而 If-Modified-Since則是由客戶端往服務(wù)器發(fā)送的頭,可以看到,再次請求本地存在的 cache 頁面時,客戶端會通過 If-Modified-Since頭將先前服務(wù)器端發(fā)過來的 Last-Modified最后修改時間戳發(fā)送回去,這是為了讓服務(wù)器端進行驗證,通過這個時間戳判斷客戶端的頁面是否是最新的,如果不是最新的,則返回新的內(nèi)容,如果是最新的,則返回304告訴客戶端其本地cache的頁面是最新的,于是客戶端就可以直接從本地加載頁面了,這樣在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)就會大大減少,同時也減輕了服務(wù)器的負擔。
如果不想讓代理或瀏覽器緩存,加no-cache參數(shù)或private參數(shù):
# expires 1d;
add_header Cache-Control no-cache;
add_header Cache-Control private;

etag:實體標簽,是用來確認web服務(wù)器和瀏覽器緩存有效性的一種機制。原始服務(wù)器使用ETag響應(yīng)頭來指定組件的ETag瀏覽器通過If-None-Match頭將ETag傳回原始服務(wù)器。如果匹配,返回304
如圖:
第一次訪問:
請求:

返回:

第二次請求:

返回:

依然返回的狀態(tài)碼是304,而在請求中比第一次多了If-None-Match頭。所以實現(xiàn)瀏覽器緩存。如果這個值對不上,則緩存過期。
ETags和If-None-Match是一種常用的判斷資源是否改變的方法。類似于Last-Modified和HTTP-If-Modified-Since。但是有所不同的是Last-Modified和HTTP-If-Modified-Since只判斷資源的最后修改時間,而ETags和If-None-Match可以是資源任何的任何屬性。
ETags和If-None-Match的工作原理是在HTTPResponse中添加ETags信息。當客戶端再次請求該資源時,將在HTTPRequest中加入If-None-Match信息(ETags的值)。如果服務(wù)器驗證資源的ETags沒有改變(該資源沒有改變),將返回一個304狀態(tài);否則,服務(wù)器將返回200狀態(tài),并返回該資源和新的ETags。
IIS上的ETag格式需要修改。
另一篇文章講解的也非常清楚: http://www.fzitv.net/article/33214.htm
相關(guān)文章
nginx設(shè)置上傳目錄無執(zhí)行權(quán)限的方法
在windows+iis下,可以設(shè)置上傳目錄,類似:upload,uploadfile,attachments,這樣的目錄下面無腳本執(zhí)行權(quán)限,從而防止非法用戶上傳腳本得到webshell2010-11-11
Nginx 配置TCP代理轉(zhuǎn)發(fā)的實現(xiàn)
本文主要介紹了使用Nginx新版的stream方式,實現(xiàn)TCP/UDP代理轉(zhuǎn)發(fā),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10
如何在centos上使用yum安裝rabbitmq-server
這篇文章主要介紹了如何在centos上使用yum安裝rabbitmq-server,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
nginx啟動、關(guān)閉及重啟等簡單命令小結(jié)
這篇文章主要介紹了使用命令行重啟Nginx的方法,包括修改配置文件后重啟以使更改生效,查看端口占用情況,以及如何關(guān)閉Nginx,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-03-03
nginx ServerName匹配規(guī)則實現(xiàn)
本文主要介紹了nginx ServerName匹配規(guī)則實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2007-02-02

