如何通过仅包含压缩文件,根据请求的可接受编码类型提供压缩/未压缩文件

时间:2014-04-10 13:56:54

标签: apache

在apache htdocs中,我想只有压缩文件(gzip文件)并且基于请求的接受编码类型,如果启用了gzip编码,我希望apache提供压缩文件,如果不支持gzip编码,那么我希望通过解压缩gzip文件来提供服务。

我不想保留未压缩的文件并在访问时使用deflate进行压缩,因为这样效率很低,并且默认情况下所有客户端都支持gzip编码。

通过同时拥有压缩文件和未压缩文件(example.js和example.jsgz都在htdocs目录中),我能够通过在请求的接受编码和RedirectRules上使用RedirectCond来完成这项工作。但是这需要存储两个文件(压缩文件和普通文件)。以下是我使用重定向规则的配置。

<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内的app目录的内容

ls app/
example.jsgz

app目录的服务器端apache配置

在这种情况下使用MultiView选项,当请求文件是example.js时,我能够服务器example.jsgz,因为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编码。请求的url是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编码。请求的url是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

当客户端不支持gzip编码时,只有在htdocs中使用压缩文件,有没有办法处理案例2?

我已经阅读了关于膨胀和缩小选项的信息。还有关于Multiviews选项。但是当目录包含压缩格式(gzip编码)的多种类型的内容(javascript,css,html)时,我在目录级别找不到示例。

提前致谢

1 个答案:

答案 0 :(得分:0)

看起来这就是您所需要的http://www.innerjoin.org/apache-compression/howto.html

虽然我没有尝试过任何方式。

另一种选择可能是使用一些脚本语言来运行解压缩和响应(php,ruby,perl ......)

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