mod_deflate 使用 IBM WebSphere 和 IBM IHS

mod_deflate with IBM WebSphere and IBM IHS

我正在尝试为 css、js 和 html 资源启用响应压缩,这些资源被捆绑为部署到 WebSphere v7 的 Web 应用程序的一部分。所有 HTTP 流量都路由到位于 WebSphere 实例前面的 IBM IHS HTTP 服务器。

我创建了一个 mod_deflate.conf 文件并将其导入到 httpd.conf 文件中。内容如下:

LoadModule deflate_module modules/mod_deflate.so

DeflateCompressionLevel 3

# Compress all content, manually excluding specified file types 
<IfModule mod_deflate.c>   
    # place filter 'DEFLATE' on all outgoing content       
    SetOutputFilter DEFLATE   
    # exclude uncompressible content via file type   
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|rar|zip)$ no-gzip   
    <IfModule mod_headers.c>
        # properly handle requests coming from behind proxies
        Header append Vary User-Agent   
    </IfModule> 
</IfModule>

# deflate.log, log compression ratio on each request 
<IfModule mod_deflate.c>
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    CustomLog logs/deflate.log deflate
</IfModule>

# Properly handle old browsers that do not support compression
<IfModule mod_deflate.c>
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</IfModule>

当我查看 HTTP 流量时,我看到请求指定 gzip/deflate 编码是可接受的:

Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Accept-Encoding:"gzip, deflate" 

但是,响应没有被压缩(没有 header 被返回与 gzip/deflate 相关):

Content-Type:"text/html; charset=UTF-8"
Vary:"User-Agent"
Server:"IBM_HTTP_Server"

另外,deflate.log 没有显示任何压缩发生:

"GET /webapp/css/style.css HTTP/1.1" -/- (-%)
"GET /webapp/js/jquery/jquery.ui.draggable.min.js HTTP/1.1" -/- (-%)
"POST /webapp/markup/Basic.xhtml HTTP/1.1" -/- (-%)

正在发回 Vary 响应 header,因此它肯定会到达声明 SetOutputFilter 的配置块。

我在这里遗漏了什么 -- 内容压缩 on-the-fly 是否基于 filters/content type/resource 名称匹配?在上面的例子中,所有不匹配正则表达式 .(?:gif|jpe?g|png|rar|zip)$ no-gzip 的东西都应该被压缩,不?

1. Uncomment
LoadModule deflate_module modules/mod_deflate.so
2. Add 
<IfModule mod_deflate.c>
    <Location / > <!-- you can specify your app URL also-->
        # Space separated mime types.
        AddOutputFilterByType DEFLATE text/html text/plain application/json 
    </Location>
</IfModule>

好的,我终于能够解决根本原因了。我们正在通过 IBM WebSeal front-end 代理访问 Web 应用程序。

当我绕过 WebSeal 直接访问应用程序时,返回了以下 HTTP 响应 header:

Content-Encoding:"gzip"

所以,现在我必须在返回客户端之前解决内容被解压的问题。

按数字播放这个 - 您查看了来自客户端的原始 HTTP headers 而不是 WebSeal 发布的 hedaers,WebSeal 决定剥离 Accept-Encoding 所以它没有必须自己担心同一资源的多个变体。

剥离可能可以通过一些晦涩的 webseal 方式进行配置。