如何利用Apache mod_expires 與 mod_headers 實作檔案快取及mod_deflate壓縮輸出

jacklove
發布: 2023-03-31 13:00:01
原創
2248 人瀏覽過

1.使用mod_deflate module 壓縮輸出(啟動gzip)

#開啟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>
登入後複製

2.利用Apache mod_expires 與mod_headers 實作檔案快取


開啟mod_expiresmod_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>
登入後複製

#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,可能並不總是那麼精準.因為即使緩存者,認為是新鮮的,也不能保證伺服器端沒有做過更新.如果緩存者是一個緩存代理伺服器,如果其試圖重新驗證時,無法連接上原始伺服器,則也不允許返回一個不新鮮的,快取中的副本.而是必須傳回一個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

.實作檔案快取及mod_deflate壓縮輸出,更多相關內容請關注php中文網。

相關推薦:


關於HTML5 history API 的介紹

關於冒泡,二分法插入,快速排序演算法的介紹

講解php 支援斷點續傳的檔案下載類別的相關內容

以上是如何利用Apache mod_expires 與 mod_headers 實作檔案快取及mod_deflate壓縮輸出的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!