2014-04-10 105 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的... ...)

至于性能,两个版本都是最好的选择,因为它不需要任何额外的努力。