在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)时,我在目录级别找不到示例。
提前致谢
答案 0 :(得分:0)
看起来这就是您所需要的http://www.innerjoin.org/apache-compression/howto.html
虽然我没有尝试过任何方式。
另一种选择可能是使用一些脚本语言来运行解压缩和响应(php,ruby,perl ......)
至于性能,两种版本都是最佳选择,因为它不需要任何额外的努力。