我把这个发布在 stack overflow 上,但有人建议我在这里可能会更幸运:
我以前没有使用过 deflate 来编码网页,所以这对我来说是新领域,但当我在 ff 中查看网络流量时,我的 all.js 文件从 427kb 变为 117kb,所以我似乎在这里可以正常工作。但在 IE9 中没有变化。我的响应标头在 FF 中显示 Content-Encoding: gzip,但在 IE9 中没有
这是我的.htaccess:
<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>
IE9 中 all.js 的请求标头:
Key Value
Request GET /all.js HTTP/1.1
Accept application/javascript, */*;q=0.8
Referer http://www.alexchapman.co.uk/
Accept-Language en-GB
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding gzip, deflate
Host static.alexchapman.co.uk
Connection Keep-Alive
Cache-Control no-cache
IE9 中 all.js 的响应标头:
Key Value
Response HTTP/1.1 200 OK
Date Tue, 28 Feb 2012 15:53:41 GMT
Server Apache/2
Last-Modified Tue, 28 Feb 2012 15:53:40 GMT
Accept-Ranges bytes
Cache-Control private
Expires Fri, 02 Mar 2012 03:53:41 GMT
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Transfer-Encoding chunked
Content-Type text/javascript
Firefox 中 all.js 的请求标头:
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-gb,en;q=0.5
Cache-Control: no-cache
Connection: keep-alive
Cookie: DELETED - this should not be sent and isnt sent with IE
Host: static.alexchapman.co.uk
Pragma: no-cache
Referer: http://www.alexchapman.co.uk/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Firefox 中 all.js 的响应标头:
Accept-Ranges: bytes
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/javascript
Date: Tue, 28 Feb 2012 15:55:26 GMT
Expires: Fri, 02 Mar 2012 03:55:26 GMT
Keep-Alive: timeout=15, max=100
Last-Modified: Tue, 28 Feb 2012 15:55:26 GMT
Server: Apache/2
Transfer-Encoding: chunked
Vary: Accept-Encoding
需要说明的是,这不仅仅发生在 all.js 上 - 我使用它作为示例,因为它是压缩后最大的文件。任何有关我做错什么的建议都将不胜感激。
**********更新************
我的托管服务提供商回复了我并说他们可以确认 gzip 和 deflate 都已启用并在我的网站上运行,他们说 Internet Explorer 的问题特定于该浏览器,因此我建议尝试兼容模式,因为这不是由我们的服务器引起的。
我知道 IE 中有一个兼容性视图,它应该有助于正确呈现旧网站,所以我不知道他们在这里做什么,但我可以确认这对文件压缩没有影响。
答案1
我想我已经搞清楚这里发生了什么。我下载了Wireshark并通过它检查了网络流量。我为此苦苦挣扎了一阵子,但我想我现在已经明白了——如果有人能确认我做得正确,那就太好了。
以文件 all.js 为例,我在 Firefox 和 IE9 中跟踪了请求的 tcp 流。两者都表示它们使用了 gzip 加密。有趣的是,对话的总大小不同。IE9 – 268471 字节 FF-120812 字节(均小于未压缩的文件)。
这大约是 firebug 中报告的正确文件大小。但只有 IE 开发者工具中报告的文件大小的一半。因此,IE 似乎不仅在 gzip 方面表现较差,而且其开发者工具错误地报告了比实际情况更差的情况。如果有人可以验证这个结果或提出解释,我会接受他们的答案。
答案2
虽然不是“答案”,但是mod_gzip对我来说效果很好(IE9 也一样)。我的配置:
<IfModule gzip_module>
mod_gzip_on Yes
mod_gzip_item_include mime text/.*
mod_gzip_item_include mime application/xm.*
mod_gzip_item_include mime application/javascript
mod_gzip_item_include mime image/svg.*
mod_gzip_dechunk Yes
</IfModule>
Deflate 和 GZip 几乎是同一个东西,gzip 从技术上来说比较慢,但在现代计算机上,可以在客户端安全地忽略差异,如果您正在缓存响应,则可以在服务器端忽略差异(动态生成的页面是不可能的)。
答案3
Content-Encoding: gzip
即使请求是 gzip 压缩的,IE9 也不会显示标头,因此在检查是否启用 gzip 压缩时不要相信 MSIE。
另外,要小心 MSIE + TLS + gzip + chunked 传输编码组合,存在一些错误,例如:https://support.microsoft.com/kb/871205