#開啟mod_deflate
sudo a2enmod deflate sudo /etc/init.d/apache2 restart
在httpd.conf中加入
<IfModule mod_deflate.c> #单独设置需要压缩的类型 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/x-javascript </IfModule>
如預設所有輸出都需要壓縮,只排除部分。
<IfModule mod_deflate.c> SetOutputFilter DEFLATE #插入过滤器,gzip所有输出 #设置不压缩的类型 SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary </IfModule>
開啟mod_expires 與mod_headers
sudo a2enmod expires sudo a2enmod headers sudo /etc/init.d/apache2 restart
利用mod_expires,在httpd. conf中加入
<IfModule mod_expires.c> ExpiresActive on #开启 ExpiresDefault A300 #默认 ExpiresByType text/html A300 ExpiresByType text/css A2592000 # 30天 ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType application/x-javascript A2592000 </IfModule>
利用mod_headers,在httpd.conf中加入##
<IfModule mod_headers.c> <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=604800, public" </FilesMatch> <FilesMatch "\.(xml|txt)$"> Header set Cache-Control "max-age=18000, public, must-revalidate" </FilesMatch> <FilesMatch "\.(html|htm|php)$"> Header set Cache-Control "max-age=3600, must-revalidate" </FilesMatch> </IfModule>
網頁的快取是由HTTP訊息標頭中的「Cache-control」來控制的,常見的取數值有private、no-cache、max-age、must- revalidate等,預設為private。其作用依不同的重新瀏覽方式分為以下幾種情況:
(1) 開啟新視窗
值為private、no-cache、must-revalidate,那麼開啟新視窗存取時都會重新存取伺服器。
而如果指定了max-age值,那麼在此值內的時間裡就不會重新訪問伺服器,例如:
Cache-control: max-age=5(表示當訪問此網頁後的5秒內再次訪問不會去伺服器)
(2) 在地址列回車
值為private或must-revalidate則只有第一次訪問時會訪問伺服器,以後就不再訪問。
值為no-cache,那麼每次都會造訪。
值為max-age,則在過期之前不會重複存取。
(3) 按後退按扭
值為private、must-revalidate、max-age,則不會重訪問,
值為no-cache,則每次重複訪問
( 4) 按刷新按扭
無論為何值,都會重複存取
Cache-Control(常規標頭,HTTP1.1)
#.public:(僅為回應標頭)
回應:告知任何路徑的快取者,可以無條件的快取該回應.
.private(僅為回應標頭)
回應:告知快取者(據我所知,是指使用者代理,常見瀏覽器的本地快取.使用者也是指,系統使用者.但也許,不應排除,某些網關,可以識別每個終端使用者的情況),只針對單一使用者快取回應. 且可以具體指定某個欄位.如private –“username”,則回應頭中,名為username的標頭內容,不會被共用快取.
.no-cache:
請求: 告知快取者,必須原原本本的轉發原始請求,並告知任何快取者,別直接拿你快取的副本,糊弄人.你需要去轉發我的請求,並驗證你的快取(如果有的話).對應名詞:端對端重載.
回應: 允許快取者快取副本.那麼其實際價值是,總是強制快取者,校驗緩存的新鮮度.一旦確認新鮮,則可以使用緩存副本作為響應. no-cache,還可以指定某個包含字段,比如一個典型應用,no-cache=Set-Cookie. 這樣做的結果,就是告知快取者,對於Set-Cookie欄位,你不要使用快取內容.而是使用新滴.其他內容則可以使用快取.
.no-store:
請求:告知,請求和回應都禁止被快取.(也許是出於隱私考慮)
回應:同上.
.max-age:
請求:,校驗新鮮性.即與自身的Age值,與請求時間做比較.如果超出max-age值,則強制去伺服器端驗證.以確保返回一個新鮮的響應.其功能本質上與傳統的Expires類似,但差別在於Expires是根據某個特定日期值做比較.一但快取者本身的時間不準確.則結果可能就是錯誤的.而max-age,顯然無此問題. Max-age的優先權也是高於Expires的.
回應:同上類似,只不過發出方不一樣.
.max-stale:
請求:意思是,我允許快取者,發送一個, ## 請求:意思是,我允許快取者,發送一個,過期不期超過指定秒數的,陳舊的快取.
回應:同上.
.must-revalidate(僅為回應標頭)
回應:期,則必須重新驗證.而不是試圖返回一個不在新鮮期的緩存.與no-cache的區別在於,no-cache,完全無視新鮮期的概念.總是強制重新驗證.理論上,must-revalidate更節省流量,但相比no-cache,可能並不總是那麼精準.因為即使緩存者,認為是新鮮的,也不能保證伺服器端沒有做過更新.如果緩存者是一個緩存代理伺服器,如果其試圖重新驗證時,無法連接上原始伺服器,則也不允許返回一個不新鮮的,快取中的副本.而是必須傳回一個504 Gateway timeout.
.proxy-revalidate(僅為回應標頭)
回應:限制上與must-revalidate類似.區別在於受體的範圍.proxy-revalidate,是要排除掉用戶代理的緩存的.即,其規則並不應用於用戶代理的本地快取上.
.min-fresh(僅為請求標頭)
#請求:告知快取者,如果當前時間加上min-fresh的值,超了該快取的過期時間.則要給我一個新的.其實個人覺得,其功能上有點和max-age類似.但是更大的是語意上的差異.
.only-if-cached:(僅為請求標頭)
請求:告知緩存者,我希望內容來自緩存,我並不關心被快取回應,是否是新鮮的.
.s-maxage(僅為回應標頭)
回應:與max-age的唯一差異,s-maxage僅應用於共享快取.而不引用於用戶代理的本地緩存,等針對單用戶的緩存. 另外,s-maxage的優先級要高於max-age..cache-extension (cache-extension是一個泛化的代稱.它指所有自訂,或者說擴展的,指令,客戶端和伺服器端都可以自訂擴展Cache-Control相關的指令.) 那麼,實際上我們可以這樣Cache-Control:max-age=300, custom-directive = xxx,
public. 這樣我們就定義了一個被統稱為cache-extension的擴充指令.該指令如果對應的客戶端或伺服器端,不認識,就會忽略掉.
.no-transform
請求:告知代理,不要改變媒體類型,例如jpg,被你改成png.
回應:同上.
.實作檔案快取及mod_deflate壓縮輸出,更多相關內容請關注php中文網。
相關推薦:以上是如何利用Apache mod_expires 與 mod_headers 實作檔案快取及mod_deflate壓縮輸出的詳細內容。更多資訊請關注PHP中文網其他相關文章!