URL:

很早之前就发现一个奇怪的问题,ie第一次打开一个页面时,javascript正常加载,在点开一个新的链接时,里面的javascript不加载,再刷新一下才能加载

server端已经设置了
Cache-Control: no-cache, must-revalidate
Expires: Mon, 26 Jul 1997 05:00:00 GMT
html中的js路径也加了随机数,ie获取的脚本是从服务器获得,并且内容正确,不是cache,可就是不执行!

我在blueidea上问过这个问题,但无人回答,可能是描述的不够清楚,也可能是没人注意这个问题。

给服务器关掉gzip后,页面加载速度明显慢了很多,非常不爽,所以又去解决这个问题。最终在一些国外网站上找到了问题的原因。


Diagnosing suspected problems with mod_deflate

文中列举了几个关于ie处理gzip(mod_deflate跟gzip是一样的功能)压缩过的文件的一些bug:

如果从使用 HTTP 压缩的 Web 服务器发回数据,Internet Explorer 可能会丢失数据的前 2,048 个字节 (there is a similar one for IE 5.5):
http://support.microsoft.com/default.aspx?scid=kb;[LN];Q312496

Here's another article about an IE bug with Javascript in the presence of cache-control: no-cache:
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B327286.

下面是一个新闻组中关于gzip后的javascript第一次打开不加载的问题:
http://lists.over.net/pipermail/mod_gzip/2001-March/001706.html

问题好像是ie的异步处理机制导致的,ie加载完了js文件之后就开始解析,而没有等到gzip解压完毕,所以js文件不能正确加载,但这样的解释又很牵强,因为再刷新一次又可以正常加载。

令人郁闷的是ie6至今未能解决这个问题,ie7没试过。m$给出的解决办法令人汗颜:“Do not enable HTTP compression for the script files”

所以我现在只好针对ie特殊处理,不压缩脚本文件。

 

gzip压缩存在很多兼容问题的,上次看到过一篇文章,Flickr的开发人员写的。

http://www.thinkvitamin.com/features/webapps/serving-javascript-fast

除非在肯定客户端可以正确解压下才使用gzip输出,比如正对 FireFox

以前发现用FireFox浏览Gmail是用deflate压缩输出的。

输出是在确定支持之后输出的,ie6也支持gzip

deflate是apache的一个模块,apache2之后默认的就是mod_deflate了,取代了gzip。