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 方式进行配置。
我正在尝试为 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 方式进行配置。