前面介紹了Nginx設(shè)置瀏覽器緩存和IIS設(shè)置瀏覽器緩存的方法,由于Apache web服務(wù)器使用人數(shù)眾多,故今天將著重介紹Apache設(shè)置瀏覽器緩存的方法,供大家參考。
第一,找到Apache配置文件 httpd.conf
Apache設(shè)置瀏覽器緩存是通過(guò)修改配置文件 httpd.conf 來(lái)實(shí)現(xiàn)的,所以首先要找到并打開(kāi) httpd.conf ,這個(gè)文件的位置在 \Apache安裝目錄\conf\ 下。如果你不知道Apache的安裝目錄,那么對(duì)于windows服務(wù)器,你可以在C盤(pán)(D盤(pán)、E盤(pán))通過(guò)搜素“httpd.conf”來(lái)找到該文件。對(duì)于linux用戶,可以通過(guò)命令 find / -name httpd.conf 來(lái)找到該文件。
第二,更改Apache配置文件 httpd.conf
找到了 httpd.conf 后,用記事本(或任何編輯器)打開(kāi)它。Ctrl+F搜索 #LoadModule expires_module modules/mod_expires.so,把 #LoadModule expires_module modules/mod_expires.so 的注釋符號(hào)“#”去掉。
圖二:Apache啟用瀏覽器緩存
然后,在最后面添加如下代碼:
<IfModule expires_module>
ExpiresActive On
#css文件緩存86400/3600/24=1天
ExpiresByType text/css A86400
#js文件緩存86400/3600/24=1天
ExpiresByType application/x-javascript A86400
ExpiresByType application/javascript A86400
#html文件緩存86400/3600/24=1天
ExpiresByType text/html A86400
#圖片文件緩存86400/3600/24=1天
ExpiresByType image/jpeg A86400
ExpiresByType image/gif A86400
ExpiresByType image/png A86400
ExpiresByType image/x-icon A86400
#文件默認(rèn)緩存1天
ExpiresDefault "access plus 1 day"
</IfModule>
添加IfModule expires_module
代碼解釋:
"access plus 1 days" 表示文件瀏覽器緩存1天
"access plus 1 month" 表示文件默認(rèn)瀏覽器緩存1個(gè)月
A86400”,是一天的時(shí)間(秒),86400=24*3600
我們可以參考這個(gè)實(shí)例的寫(xiě)法,自定義css、js、圖片的瀏覽器緩存時(shí)間。
注意事項(xiàng)
設(shè)置完畢,需要重啟Apache服務(wù)。
測(cè)試瀏覽器緩存設(shè)置是否成功
建議到卡卡網(wǎng)的網(wǎng)站速度診斷平臺(tái),使用“高級(jí)診斷”檢測(cè)你的網(wǎng)站,它全面掃描網(wǎng)站的各種類型的文件,然后判斷是否使用了瀏覽器緩存。
檢測(cè)網(wǎng)站瀏覽器緩存時(shí)間
知識(shí)擴(kuò)展:Apache中關(guān)于頁(yè)面緩存的設(shè)置
Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)協(xié)議中和網(wǎng)頁(yè)緩存相關(guān)的幾個(gè)字段。前兩個(gè)用來(lái)控制緩存的失效日期,后兩個(gè)用來(lái)驗(yàn)證網(wǎng)頁(yè)的有效性。要注意的是, HTTP/1.0有一個(gè)功能比較弱的緩存控制機(jī)制:Pragma,使用HTTP/1.0的緩存將忽略Expires和Cache-Control頭。我們 這里以Apache2.0服務(wù)器為例,只討論HTTP/1.1協(xié)議。
Expires
Expires字段聲明了一個(gè)網(wǎng)頁(yè)或URL地址不再被瀏覽器緩存的時(shí)間,一旦超過(guò)了這個(gè)時(shí)間,瀏覽器都應(yīng)該聯(lián)系原始服務(wù)器。RFC告訴我們:“由于推斷的失效時(shí)間也許會(huì)降低語(yǔ)義透明度,應(yīng)該被謹(jǐn)慎使用,同時(shí)我們鼓勵(lì)原始服務(wù)器盡可能提供確切的失效時(shí)間。”
對(duì)于一般的純靜態(tài)頁(yè)面,如html、gif、jpg、css、js,默認(rèn)安裝的Apache服務(wù)器,不會(huì)在響應(yīng)頭添加這個(gè)字段。Firefox瀏覽 器接受到相應(yīng)后,如果發(fā)現(xiàn)沒(méi)有Expires字段,瀏覽器根據(jù)文件的類型和“Last-Modified”字段來(lái)推斷出一個(gè)合適的失效時(shí)間,并存儲(chǔ)在客戶 端。推測(cè)出的時(shí)間一般是接受到響應(yīng)時(shí)間后的三天左右。
Apache的expires_module模塊可以在Http響應(yīng)頭部自動(dòng)加上Expires字段。在Apache的httpd.conf文件中進(jìn)行如下配置:
# 啟用expires_module模塊
LoadModule expires_module modules/mod_expires.so
# 啟用有效期控制
ExpiresActive On
# GIF有效期為1個(gè)月
ExpiresByType image/gif A2592000
# HTML文檔的有效期是最后修改時(shí)刻后的一星期
ExpiresByType text/html M604800
# 以下的含義類似
ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
對(duì)于動(dòng)態(tài)頁(yè)面,如果在頁(yè)面內(nèi)部沒(méi)有通過(guò)函數(shù)強(qiáng)制加上Expires,例如header(”Expires: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服務(wù)器會(huì)把Wed, 11 Jan 1984 05:00:00 GMT
作為Expires字段內(nèi)容,返回給瀏覽器。即認(rèn)為動(dòng)態(tài)頁(yè)面總是失效的。而瀏覽器仍然會(huì)保存已經(jīng)失效的動(dòng)態(tài)頁(yè)面。
可以發(fā)現(xiàn)Firefox瀏覽器總是緩存所有頁(yè)面,不管失效、不失效還是沒(méi)有聲明失效時(shí)間。即使緩存中聲明了一個(gè)網(wǎng)頁(yè)的實(shí)效日期是1970-01- 01 08:00:00,瀏覽器仍然會(huì)發(fā)送該文件在緩存中的Last-Modified和ETag字段。 如果在服務(wù)器端驗(yàn)證通過(guò),返回304狀態(tài),瀏覽器就還會(huì)使用此緩存。
Cache-Control
Cache-Control字段中可以聲明多些元素,例如no-cache, must-revalidate, max-age=0等。這些元素用來(lái)指明頁(yè)面被緩存最大時(shí)限,如何被緩存的,如何被轉(zhuǎn)換到另一個(gè)不同的媒介,以及如何被存放在持久媒介中的。但是任何一個(gè) Cache-Control指令都不能保證隱私性或者數(shù)據(jù)的安全性。“private”和“no-store”指令可以為隱私性和安全性方面提供一些幫 助,但是他們并不能用于替代身份驗(yàn)證和加密。
Apache的mod_cern_meta模塊允許文件級(jí)Http響應(yīng)頭部的控制,同時(shí)它也可以配置Cache-Control頭(或任何其他頭)。響應(yīng)頭文件是放在原始目錄的子目錄中,根據(jù)原始文件名所命名的一個(gè)文件。具體用法請(qǐng)參閱Apache的官方網(wǎng)站。
其中Cache-Control : max-age表示失效日期。如果沒(méi)有啟動(dòng)mod_cern_meta模塊,Apache服務(wù)器會(huì)把Expires字段中的日期換算成以秒為單位的一個(gè) delta值,賦值給max-age。如果啟動(dòng)mod_cern_meta模塊,并且配置了max-age值,Apache會(huì)將這個(gè)覆蓋Expires字 段。同時(shí),max-age隱含了Canche-Control: public。這樣瀏覽器接受到的Cache-Control : max-age和Expires值就是一致的。
如果失效日期Cache-Control : max-ag=0或者是負(fù)值,瀏覽器會(huì)在對(duì)應(yīng)的緩存中把Expires設(shè)置為1970-01-01 08:00:00。
Last-Modified
Last-Modified和ETag是條件請(qǐng)求(Conditional Request)相關(guān)的兩個(gè)字段。如果一個(gè)緩存收到了針對(duì)一個(gè)頁(yè)面的請(qǐng)求,它發(fā)送一個(gè)驗(yàn)證請(qǐng)求詢問(wèn)服務(wù)器頁(yè)面是否已經(jīng)更改,在HTTP頭里面帶上” ETag”和”If Modify Since”頭。服務(wù)器根據(jù)這些信息判斷是否有更新信息,如果沒(méi)有,就返回HTTP 304(Not Modify);如果有更新,返回HTTP 200和更新的頁(yè)面內(nèi)容,并且攜帶新的”ETag”和”Last-Modified”。
使用這個(gè)機(jī)制,能夠避免重復(fù)發(fā)送文件給瀏覽器,不過(guò)仍然會(huì)產(chǎn)生一個(gè)HTTP請(qǐng)求。
一般純靜態(tài)頁(yè)面本身都會(huì)有Last-Modified信息,Apache服務(wù)器會(huì)讀取頁(yè)面文件中的Last-Modified信息,并添加到http響應(yīng)頭部。
對(duì)于動(dòng)態(tài)頁(yè)面,如果在頁(yè)面內(nèi)部沒(méi)有通過(guò)函數(shù)強(qiáng)制加上Last-Modified,例如header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服務(wù)器會(huì)把當(dāng)前時(shí)間作為L(zhǎng)ast-Modified,返回給瀏覽器。
無(wú)論是純靜態(tài)頁(yè)面還是動(dòng)態(tài)頁(yè)面,F(xiàn)irefox瀏覽器巧妙地按照接受到服務(wù)器響應(yīng)的時(shí)間設(shè)置緩存頁(yè)面的Last-Modified,而不是按照http響應(yīng)頭部中的Last-Modified字段。
ETag
既然有了Last-Modified,為什么還要用ETag字段呢?因?yàn)槿绻谝幻腌娭畠?nèi)對(duì)一個(gè)文件進(jìn)行兩次更改,Last-Modified就會(huì)不正確。因此,HTTP/1.1利用Entity Tag頭提供了更加嚴(yán)格的驗(yàn)證。
Apache服務(wù)器默認(rèn)情況下,會(huì)對(duì)所有的靜態(tài)、動(dòng)態(tài)文件的響應(yīng)頭添加ETag字段。
在Apache的httpd.conf文件中可以通過(guò)FileETag指令配置該選項(xiàng)。FileETag指令配置了當(dāng)文檔是基于一個(gè)文件時(shí)用以創(chuàng)建 Etag(entity tag)響應(yīng)頭的文件的屬性。在Apache 1.3.22及以前,ETag的值是對(duì)文件的索引節(jié)(INode),大小(Size)和最后修改時(shí)間(MTime)進(jìn)行Hash后得到的。 如果一個(gè)目錄的配置包含了‘FileETag INode MTime Size’而其一個(gè)子目錄包含了‘FileETag -INode’那么這個(gè)子目錄的設(shè)置(并會(huì)被其下任何沒(méi)有進(jìn)行覆蓋的子目錄繼承)將等價(jià)于‘FileETag MTime Size’。
在多臺(tái)負(fù)載平衡的服務(wù)器環(huán)境下,同一個(gè)文件會(huì)有不同的etag或者文件修改日期,瀏覽器每次都會(huì)重新下載。設(shè)置‘FileETag None’可以使響應(yīng)頭不再包含ETag字段。
相關(guān)文章
阿里云主機(jī)windows系統(tǒng)apache啟用瀏覽器緩存的方法