如果浏览器允许压缩,我正在使用 Django GZip 中间件 (django.middleware.gzip.GZipMiddleware) 来压缩内容。
如果浏览器是 Internet Explorer (MSIE) 并且内容是 Javascript 文件,则中间件不会对内容进行 gzip。我的理解是,中间件在这种情况下避免压缩,因为 IE6(没有补丁)存在 gzip 响应问题。
对于我们的网站,我们不支持 IE6,但支持 IE7 和 IE8。考虑到我们不支持 IE6,即使浏览器是 IE,我们最好的做法是 gzip 所有 javascript 文件吗?
如果是这样,压缩这些文件的最佳方法是什么?我们希望继续使用 Django 中间件模块进行 gzip。我们是否应该复制 gzip 中间件模块并编辑处理 IE 和 Javascript 的几行(这感觉就像我们违反了 DRY)?使用 Apache 进行 gzip 也是一种选择。
受 JS/CSS 上的 gzip 问题影响的 IE6 版本不再普遍流通(即使在当时也是少数情况)。 Netscape 4 已经消失很久了。
因此,我强烈建议删除所有现有的用户代理嗅探 gzip hacks。根据标准 HTTP/1.1,将压缩的 HTML/JS/CSS 发送到所有请求它的浏览器(使用
Accept-Encoding
)。
if "msie" in request.META.get('HTTP_USER_AGENT', '').lower():
哦亲爱的。即使按照 UA 嗅探的令人沮丧的标准来看,这也是一个非常糟糕的测试。不检查它是否实际上
MSIE
在字符串中的正确位置(而不是所有尾随位中的任何位置;很容易得到误报),并且它不检查 SV1
,这是 gzip 测试的传统方法(因为 IE6SP2+ 版本不会受到该错误的影响),因此它会破坏 all IE 的压缩,这是不必要的。
它也不会设置
Vary: User-Agent
,因此代理将缓存错误的版本。当不使用 Vary: Accept-Encoding
时,它会为 IE 设置 Content-Encoding
,因此它会 破坏 IE 中的缓存。
我们是否应该复制 gzip 中间件模块并编辑处理 IE 和 Javascript 的几行(这感觉就像我们违反了 DRY)?
你可以,也许可以将补丁提交给 Django。因为在我看来,他们目前的方法完全被打破了。
使用 Apache 进行 gzip 也是一种选择。
是的,如果你有 Apache 上游,一定要使用它(例如,使用
mod_deflate
)。如果您也可以使用它来提供脚本等静态文件,那么它是最有效的。 (尝试将 JS 保留在静态脚本中,而不是即时生成/模板化。)
再次强调,不要使用
mod_deflate
页面上提到的浏览器嗅探规则。他们脆弱又丑陋,并且试图围绕过去十年中没有影响到任何人的 Netscape 问题进行编码。
当然建议尽可能使用压缩。但请记住,有些浏览器在压缩方面很挑剔。如果您能够在托管空间上使用 .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>
首先我们检查模块是否已启用,设置压缩选项,最后清理所有那些不好的浏览器!
由于“Django 本身不提供静态(媒体)文件”,似乎最佳实践是让 Apache(或 Nginx、Cherokee 或 lighttpd)处理 gzip 压缩JavaScript 文件。