2014-04-10 100 views
4

在apache htdocs中,我只想要壓縮文件(gzip文件)並基於請求的接受編碼類型,如果啓用了gzip編碼,我希望apache提供壓縮文件,如果不支持gzip編碼,那麼我希望apache通過解壓縮gzip文件來提供服務。如何根據請求接受的編碼類型提供壓縮/解壓縮文件,只有壓縮文件

我不想保留未壓縮的文件並在訪問時使用deflate進行壓縮,因爲這樣做效率低下,默認情況下所有客戶端都支持gzip編碼。

通過在htdocs目錄中同時使用壓縮和非壓縮文件(example.js和example.jsgz),我可以通過使用RedirectCond對請求的可接受編碼和RedirectRules進行工作。但是這需要存儲兩個文件(壓縮文件和普通文件)。以下是我用於重定向規則的配置。

<Directory /var/www/app> 
AddEncoding gzip .jsgz .cssgz .htmlgz 
AddType text/javascript .jsgz 
AddType text/css .cssgz 
AddType text/html .htmlgz 
SetEnv force-no-vary 
Header set Cache-Control "private" 

RewriteEngine on 
# If client accepts compressed files 
RewriteCond %{HTTP:Accept-Encoding} gzip 
# and if compressed file exists 
RewriteCond %{REQUEST_FILENAME}gz -f 
# send .htmlgz instead of .html 
RewriteRule ^(.+)\.(html|css|js)$ $1.$2gz [L] 
</Directory> 

我不想這樣做,因爲我必須保持每個文件的兩個版本。

例如:

裏面的htdocs應用目錄的內容的應用程序目錄

在這種情況下與多視圖選項

ls app/ 
example.jsgz 

服務器端apache的配置,我能服務器example.jsgz當請求文件是example.js時example.js不存在。而就我的Apache側的配置如下:

<Directory /var/www/htdocs/app> 
AddEncoding gzip .jsgz .cssgz .htmlgz 
AddType text/javascript .jsgz 
AddType text/css .cssgz 
AddType text/html .htmlgz 
Options +Multiviews 
SetEnv force-no-vary 
Header set Cache-Control "private" 
</Directory> 

案例1:

請求頭說gzip編碼的支持。請求的網址是example.js,而不是example.jsgz。這是工作和example.jsgz文件與內容編碼一起提供gzip和客戶端能夠解壓縮和使用js文件。

Request URL:http://A.B.C.D/app/example.js 
Request Method:GET 
Request HTTP headers: 
Accept-Encoding:gzip,deflate,sdch 

Response Headers: 
Content-Encoding:gzip 

案例2:

請求頭說,不支持gzip編碼。請求的網址是example.js,而不是example.jsgz。這不起作用,因爲Apache服務example.jsgz和客戶端失敗,因爲不支持gzip編碼。

Request URL:http://A.B.C.D/app/example.js 
Request Method:GET 
Request HTTP headers: 

Response Headers: 
Content-Encoding:gzip 

當客戶端不支持通過htdocs中的壓縮文件來支持gzip編碼的情況2有辦法嗎?

我已閱讀關於充氣和放氣選項。還有關於Multiviews選項。但是當目錄包含壓縮格式(gzip編碼)的多種類型的內容(javascript,css,html)時,我沒有在目錄級找到示例。

在此先感謝

回答

0

貌似這就是你需要http://www.innerjoin.org/apache-compression/howto.html

雖然我沒有以任何方式嘗試過。

另一種選擇可能是使用一些腳本語言來運行解壓縮和響應(PHP,紅寶石,Perl的... ...)

至於性能,兩個版本都是最好的選擇,因爲它不需要任何額外的努力。