safari and gzip

9
我正在从谷歌下载jQuery库(http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js),这是一个被压缩和gzip的文件。在Firefox中,jQuery文件显示为19k请求,但Safari将其显示为56k请求。因此,我认为Safari不接受它作为gzip文件。这是怎么回事?它来自谷歌,我很确定它应该是gzip的。

希望星星能够排成一线,文件在第一次访问后被缓存,之后不需要再传输。 - Nosredna
5个回答

14

我发现一个问题:在向Safari提供压缩的CSS或JS文件时,不能使用“.gz”扩展名。虽然它知道如何处理gzip文件,但只要文件带有“.gz”扩展名,它就会出现问题(这有点奇怪)。

以下是我向Safari提供压缩JS/CSS文件的方法:

  • 使用任何其他扩展名,只要不是“.gz”(“.jgz”,“.foo”或任何其他扩展名)
  • 为所选扩展名设置gzip编码头(“Content-encoding: gzip”)
  • 设置适当的MIME类型:text/javascript或text/css

所有其他浏览器都不关心您使用的扩展名,只要您设置了正确的内容类型和编码方式,因此它适用于所有浏览器。

我已经成功测试过了,使用Windows XP SP3上的Safari 4.0.4以及winxp上的Chrome 4、FF 3.5.5、IE8和Opera 10.10,确保了跨浏览器兼容性。


10年后,Safari接受.gz扩展名,只要您设置了适当的MIME类型。例如,对于压缩的js文件,您应该将.gz与MIME类型text/javascript一起设置。 - guijob

7
您可能需要查看这个链接。经过一些调查,我发现您不能使用“gz”扩展名向Safari发送压缩的javascript文件,而必须使用“jgz”。所以问题实际上是由于Google提供的是“gz”,而不是像Safari要求的“jgz”。

这可能是真的,但由于Brad提供的URL明显将其作为“.js”提供,因此在这里无关紧要。 - mercator

4

如果有人遇到同样的问题,我想补充一下。在使用开发工具进行调试并查看响应头之后,我注意到Content-Length实际上显示了正确的gzip大小。因此,我只能假设它确实获取了正确的压缩版本,但在主资源窗口中显示未压缩的大小,而标题则显示压缩的大小。


1

我至少看到两种可能性:

  • 也许 Safari 没有发送指示“我能接收 gzip”的 HTTP 标头;该标头是 Accept-Encoding,其值通常为 compress, gzip
  • 也许 Safari 正在指示未压缩数据的大小?

您是否有某种“网络嗅探器”,例如 wireshark (似乎有适用于 MacOS 的版本),以真正查看通过网络传输的内容?


给wireshark一个简短的机会,但它在加载时出现了一堆错误,并且没有加载任何网络接口。我认为Eric说得很有道理,尽管如果我无法使用谷歌来提供gzip压缩文件,那将非常令人沮丧。 - brad
很遗憾 :-( @Eric 发布的链接谈到了某种 .gz 或 .jgz 扩展名;但是我在你给出的 URL 中并没有看到这些扩展名:它只有一个 .js 扩展名 -- 而且 Google 不发送 gzipped 数据似乎是一个相当奇怪的想法,因为 Safari 是一个很新的浏览器,而这将有助于他们减少带宽成本... 但是... 如果你找到了解决方案,请告诉我们! - Pascal MARTIN

0

我也遇到了这个问题,当我试图优化iOS7 Safari移动iPad上网站的加载时间时。

  • 编码=未压缩文件大小,来自服务器
  • 解码=本地未压缩文件大小
  • 传输=未压缩文件大小+发送和接收的头信息
  • Content-Length=从服务器发送的压缩文件大小

Safari在他们的调试器中选择了一种非常奇怪的方式来表示这些数字。


这是很有用的信息,我也发现了!我以为“transferred”是指gzip压缩后的大小,但似乎不正确,它是未压缩的大小,这非常不直观。 - user427390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接