2010-08-03 16 views
2

如果浏览器允许压缩,我正在使用Django GZip中间件(django.middleware.gzip.GZipMiddleware)压缩内容。如果我们不支持IE6,那么对于IE浏览器的Javascript文件是否有意义?

如果浏览器是Internet Explorer(MSIE)并且内容是Javascript文件,那么中间件不会gzip内容。我的理解是,在这种情况下,中间件避免了压缩,因为IE6(没有补丁)对gzip响应有问题。

对于我们的网站,我们不支持IE6,但我们确实支持IE7和IE8。考虑到我们不支持IE6,即使浏览器是IE浏览器,对于我们来说gzip所有JavaScript文件是否是最佳做法?

如果是这样,什么是最好的方法来获取这些文件gzipped?我们希望继续使用Django中间件模块进行gzip。我们是否应该制作gzip中间件模块的副本,并编辑处理IE和Javascript的几行(这感觉就像我们会违反DRY)?使用Apache进行gzip也是一种选择。

+1

请参阅http://stackoverflow.com/questions/1456112/known-issues-with-gzip-and-ie6/1456264#1456264 – stuartd 2010-08-03 10:59:17

回答

5

受JS/CSS上gzip问题影响的IE6版本已不再流行(即使在当时也是少数情况)。而Netscape 4很久很久了。

由于这个原因,我会强烈建议删除所有现存的用户代理嗅探gzip黑客。根据标准HTTP/1.1,将压缩的HTML/JS/CSS发送到请求它的所有浏览器(使用Accept-Encoding)。

if "msie" in request.META.get('HTTP_USER_AGENT', '').lower(): 

哦,亲爱的。即使通过UA嗅探的凄凉标准,这也是一个非常糟糕的测试。没有检查它实际上是MSIE在字符串中的正确位置(而不是在所有尾随位中的任何位置;容易得到误报),并且它不检查传统用于gzip测试的SV1(如IE6SP2 +版本不会受到bug的影响),所以它打破了压缩的所有的 IE这只是不必要的。

它也没有设置Vary: User-Agent,所以代理会缓存错误的版本。当它不使用Content-Encoding时,它为IE设置Vary: Accept-Encoding,因此它会为break cacheing in IE

我们应该制作一个gzip中间件模块的副本,并编辑处理IE和Javascript的几行代码(这感觉就像我们会违反DRY一样)?

您可以,也可以将补丁提交给Django。因为他们目前的做法是简单地破坏IMO。

对于gzip使用Apache也是一个选项。

是的,如果你有Apache上游,肯定会使用它(例如与mod_deflate)。如果您可以使用它来提供静态文件(如脚本),则效率最高。 (尽量使你在JS脚本的静态,而不是产生于即时/模板。)

再次,不使用mod_deflate页上提到的浏览器嗅探规则。它们很脆弱,也很丑陋,并且试图围绕一个在过去十年中没有人影响的Netscape问题进行编码。

1

尽可能使用压缩是最好的。请记住,虽然有些浏览器在压缩时很挑剔。如果你必须使用你的虚拟主机空间.htaccess文件的能力,对浏览器的一个简单的条件检查可以创造奇迹,就像这样:

</IfModule> 

    <IfModule mod_deflate.c> 
     AddOutputFilterByType DEFLATE text/html 
     AddOutputFilterByType DEFLATE text/plain 
     AddOutputFilterByType DEFLATE text/xml 
     AddOutputFilterByType DEFLATE text/css 
     AddOutputFilterByType DEFLATE text/javascript 
     AddOutputFilterByType DEFLATE application/xhtml+xml 
     AddOutputFilterByType DEFLATE application/javascript 
     AddOutputFilterByType DEFLATE application/x-javascript 
     AddOutputFilterByType DEFLATE application/json 
     AddOutputFilterByType DEFLATE application/xml 
     AddOutputFilterByType DEFLATE application/rss+xml 
     AddOutputFilterByType DEFLATE application/rdf+xml 
     AddOutputFilterByType DEFLATE application/atom+xml 

     #Netscape 4.x has issues, sort them out... 

     BrowserMatch ^Mozilla/4 gzip-only-text/html 
     BrowserMatch ^Mozilla/4\.0[678] no-gzip 
     Browser 

Match \bMSIE !no-gzip !gzip-only-text/html 
</IfModule> 

首先,我们检查,看看是否模块被启用,设置我们的压缩选项,并最后挑出所有这些不好的浏览器!

相关问题