1.使用mod_deflate module 壓縮輸出(啟動gzip)
開啟mod_deflate
sudo a2enmod deflatesudo /etc/init.d/apache2 restart
在httpd.conf中添加
<IfModule mod_deflate.c>#單獨設定需要壓縮的類型AddOutputFilterByType DEFLATE text/html text/plain text/xml text/cssAddOutputFilterByType DEFLATE application/x-javascript</IfModule>
如預設所有輸出都需要壓縮,只排除部分。
<IfModule mod_deflate.c>SetOutputFilter DEFLATE #插入過濾器,gzip所有輸出#設定不壓縮的類型SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-varySetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-varySetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary</IfModule>
2.利用Apache mod_expires 與 mod_headers 實現檔案快取
開啟 mod_expires 與mod_headers
sudo a2enmod expiressudo a2enmod headerssudo /etc/init.d/apache2 restart
利用mod_expires,在httpd.conf中添加
<IfModule mod_expires.c>ExpiresActive on #開啟ExpiresDefault A300 #預設ExpiresByType text/html A300ExpiresByType text/css A2592000 # 30天ExpiresByType image/gif A2592000ExpiresByType image/jpeg A2592000ExpiresByType 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>
3.Cache-Control說明:
網頁的緩衝是由 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,可能並不總是那麼精準.因為即使緩衝者,認為是新鮮的,也不能保證伺服器端沒有做過更新.如果緩衝者是一個緩衝Proxy 伺服器,如果其試圖重新驗證時,無法串連上原始伺服器,則也不允許返回一個不新鮮的,緩衝中的副本.而是必須返回一個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.
響應:同上.
本文講解了如何利用Apache mod_expires 與 mod_headers 實現檔案快取及mod_deflate壓縮輸出 ,更多相關內容請關注php中文網。
相關推薦:
關於HTML5 history API 的介紹
關於冒泡,二分法插入,快速排序演算法的介紹
講解php 支援斷點續傳的檔案下載類的相關內容