我在 Red Hat 6.4 上的 Tomcat 应用程序前面有一个 Apache 2.2.15 实例作为代理。我正在尝试将 Apache 实例配置为对客户端的某些(列入白名单的内容类型)响应进行压缩。Apache 正在使用 mod_jk 连接到 Tomcat(尽管使用 mod_proxy 时存在相同的问题,所以我认为我的问题与 mod_jk 或 Tomcat 无关)。
我有这个非常简单的 mod_deflate 配置:
AddOutputFilterByType DEFLATE text/html
这会导致text/html
响应按预期压缩。但是,当我尝试下载由 Tomcat 生成的文件时,例如内容类型为 的电子表格application/vnd.ms-excel
,这些文件也会被压缩:
以下是直接从 Tomcat 下载文件时的响应标头:
Cache-Control:max-age=0
Content-Disposition:attachment; filename="file-20130322-104702.xls";
Content-Length:699904
Content-Type:application/vnd.ms-excel
Date:Fri, 22 Mar 2013 08:47:02 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:public
Server:Apache-Coyote/1.1
Set-Cookie:fileDownloadToken=true; Path=/
这是通过 Apache 下载文件时:
Cache-Control:max-age=0
Connection:Keep-Alive
Content-Disposition:attachment; filename="file-20130322-104524.xls";
Content-Encoding:gzip
Content-Type:application/vnd.ms-excel
Date:Fri, 22 Mar 2013 08:45:24 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Keep-Alive:timeout=30, max=100
Pragma:public
Server:Apache-Coyote/1.1
Set-Cookie:fileDownloadToken=true; Path=/
Transfer-Encoding:chunked
Vary:Accept-Encoding
我不明白为什么 mod_deflate 会压缩这个响应(上图)?
注释掉该行后AddOutputFilterByType DEFLATE text/html
,文件不再被 gzip 压缩,所以我确定触发 mod_deflate 的是该行。同样的问题也存在于内容类型为的文件下载中application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
,可能还有其他问题。但是,从 Tomcat(通过 Apache)下载 javascript 文件并没有被压缩(正如预期的那样,因为内容类型与规则不匹配):
Accept-Ranges:bytes
Cache-Control:PUBLIC, max-age=28800, must-revalidate
Connection:Keep-Alive
Content-Length:5578
Content-Type:application/javascript
Date:Fri, 22 Mar 2013 09:09:35 GMT
ETag:W/"5578-1362994418000"
Expires:Fri, 22 Mar 2013 17:09:35 GMT
Keep-Alive:timeout=30, max=100
Last-Modified:Mon, 11 Mar 2013 09:33:38 GMT
Server:Apache-Coyote/1.1
mod_deflate 压缩这些电子表格的事实是一个问题,因为它会导致响应被缓冲,触发分块编码,这是我不想要的,因为我希望浏览器显示进度监视器(这些可能是非常大的文件)。
有任何想法吗?