6

我已经看到许多关于 gzip 压缩 javascript 以节省下载时间的参考资料。 我也看到一些警告说某些浏览器不支持这个。

我有两种不同的方法可供使用:

  1. 用于mod_deflate使 Apache 通过 htaccess 压缩给定目录中的 JS/CSS 文件
  2. 用于ob_start('gzhandler')压缩文件并将其以正确的标题返回给浏览器。

方法 1 的问题在于,并非所有浏览器都支持 mod_deflate,而且我不知道如何编写.htaccess足够聪明的文件来对此进行调整。

方法 2 的问题在于,对于如何判断浏览器是否支持 gzipped 脚本或样式表,以及如果支持,则必须将什么 mime-type 作为标题中的内容类型给出明确的答案。

我需要一些建议。首先,哪种方法更被浏览器普遍接受?其次,我如何使用任何一种方法衰减来提供未压缩的备份脚本?第三,会<script src="js/lib.js.gz" type="text/javascript"></script>自己工作吗?(它显然不会衰减。)

作为记录,我正在使用具有 mod_deflate 和完整 gzip 创建功能的 PHP5,并且我的 doctype 是 xhtml strict。此外,javascript 本身是用 YUI 压缩的。 编辑: 我刚回去看了看,但我只有 Apache 1.3;我以为我有 2 个,所以很抱歉在我可能没有 mod_deflate 时提到它。

4

3 回答 3

10

mod_deflate 和 php 的 gzhandler 都基于 zlib,因此从这个意义上说,浏览器的内容压缩方式几乎没有区别。

针对您的第一个问题,您可以像这样设置模块特定的 .htaccess 信息:

<IfModule mod_deflate.c>
  # stuff
</IfModule>

针对您的第二个问题,您可以检测 PHP 中的浏览器支持:

if (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') ) {
  ob_start('ob_gzhandler');
  header("Content-Encoding: gzip");
// etc...
}

这里有一些未经测试的 .htaccess 应该能够处理压缩与未压缩 .js 文件的协商:(来源)

<FilesMatch "\\.js.gz$">
  ForceType text/javascript
  Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch "\\.js$">
  RewriteEngine On
  RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
  RewriteCond %{HTTP:Accept-Encoding} gzip
  RewriteCond %{REQUEST_FILENAME}.gz -f
  RewriteRule (.*)\.js$ $1\.js.gz [L]
  ForceType text/javascript
</FilesMatch>    
于 2008-10-09T17:04:53.590 回答
2

如果浏览器正确设置了Accept-Encoding标题,您应该能够判断浏览器是否支持 gzip:

Accept-Encoding: gzip,deflate
于 2008-10-09T17:18:11.117 回答
1

实现这一点的最佳方法是让您的服务器支持内联 gzip。您将从脚本标签的 src 属性中删除“.gz”,并将文件未压缩地存储在服务器上。如果客户端支持它,服务器会自动将脚本作为 gzip 编码结果发送。这确实会花费您的服务器一些额外的 CPU,但是对于那些支持它的客户端,文件会被压缩,而旧客户端仍然会获得扩展版本。

查看 apache2 的 mod_deflate。mod_gzip 相当于 Apache 1.x。

于 2008-10-09T17:01:22.287 回答