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

标签 apache

在apache htdocs中,我只想有压缩文件(gzip文件)并基于请求接受的编码类型,如果启用了gzip编码,我希望apache提供压缩文件,如果不支持gzip编码,那么我希望 apache 通过解压缩 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 内应用程序目录的内容

ls app/
example.jsgz

应用程序目录的服务器端 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:

请求 header 表示支持 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:

请求 header 表示不支持 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?

我读过有关充气和放气选项的内容。还有关于多 View 选项。但是当目录包含压缩格式(gzip 编码)的多种类型的内容(javascript、css、html)时,我没有在目录级别找到示例。

提前致谢

最佳答案

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

虽然我还没有尝试过。

另一种选择可能是使用某种脚本语言来运行解压并响应(php、ruby、perl...)

就性能而言,同时拥有两个版本是最好的选择,因为它不需要任何额外的努力。

关于apache - 如何仅通过压缩文件根据请求接受的编码类型提供压缩/未压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990157/

相关文章:

apache - 从虚拟主机的 URL 中删除 Tomcat 上下文(mod_jk、mod_rewrite)

php - Mac 10.6.8 上的默认 Apache、PHP 和 MySql

php - OpenSSL 在 Windows 上不起作用,错误 0x02001003 0x2006D080 0x0E064002

php - 有没有办法在带有 apache 的 PHP 中进行实时堆栈跟踪?

php wamp; www 中的禁止文件夹

php - 如何将动态子域别名与 apache 服务器上的子文件夹匹配

java - tomcat 离开 time_wait 连接

html - 使用 Apache 上传文件

java - 错误 java.lang.ClassNotFoundException : javax. enterprise.context.spi.Contextual

mySQL PDO 未在 phpinfo() 中启用