服务器端GZipping如何工作?

时间:2009-08-09 18:22:00

标签: webserver gzip content-encoding

您可能知道HTML相关文件格式是使用GZip压缩,服务器端(在Apache服务器上由mod_gzip)压缩的,并且由兼容的浏览器解压缩。 (“内容编码”)

这仅适用于HTML / XML文件吗?假设我的PHP / Perl文件生成一些简单的逗号分隔数据,并将其发送到浏览器,它是否会默认编码?

Silverlight或Flash等平台在下载此类数据时会自动由浏览器/运行时压缩/解压缩吗?有没有办法测试这个?

3 个答案:

答案 0 :(得分:9)

  

这仅适用于HTML / XML   文件?

否:它经常用于CSS和JS文件,例如 - 因为它们是网站构成的最重要的东西(图像除外),因为JS框架和完整的JS应用程序,它代表了巨大的收获!

实际上,任何基于文本的格式都可以很好地压缩(相反,图像不能,例如,因为它们通常已被压缩);有时,从Ajax请求返回的JSON数据也被压缩 - 它是文本数据,毕竟; - )

  

让我们说我的PHP / Perl文件生成   一些简单的逗号分隔数据,和   将它发送到浏览器,它会是   默认编码?

这是一个配置问题:如果您将服务器配置为压缩这类内容,它可能会被压缩:-)
(如果浏览器说它接受gzip编码的数据)


以下是我在博客上使用的Apache 2配置示例(使用mod_deflate):

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/xml
</IfModule>

在这里,我想要压缩html / xml / css / JS。

这是同样的事情,在Apache 1(mod_gzip)下加上/减去我曾经使用过的一些配置选项:

<IfModule mod_gzip.c>
    mod_gzip_on                   Yes
    mod_gzip_can_negotiate        Yes

    mod_gzip_minimum_file_size    256
    mod_gzip_maximum_file_size    500000

    mod_gzip_dechunk              Yes

    mod_gzip_item_include         file       \.css$
    mod_gzip_item_include         file       \.html$
    mod_gzip_item_include         file       \.txt$
    mod_gzip_item_include         file       \.js$
    mod_gzip_item_include         mime       text/html

    mod_gzip_item_exclude         mime       ^image/
</IfModule>

这里可以注意到的事情是,我不希望太小(增益不是很重要)或者太大(会压缩太多CPU来压缩)要压缩的文件;我希望压缩css / html / txt / js文件,但不要压缩图像。


如果您希望以相同的方式压缩以逗号分隔的数据,则必须添加其内容类型或其对Web服务器配置的扩展,以激活它的gzip压缩。

  

有没有办法测试这个?

对于直接返回浏览器的任何内容,Firefox的扩展程序FirebugLiveHTTPHeaders是必备内容。

对于不通过浏览器标准通信方式的内容,可能会更难;最后,你可能不得不最终使用类似Wireshark的东西来“嗅”通过管道的东西......祝你好运!

  

Silverlight或Flash等平台怎么样,   当他们下载这些数据时,它将被压缩/解压缩   由浏览器/运行时自动?

要回答有关Silverlight和Flash的问题,如果他们发送一个表示支持压缩内容的Accept标头,Apache将使用mod_deflate或mod_gzip。如果他们不支持压缩,他们将不会发送标题。它将“正常工作。” - Nate

答案 1 :(得分:5)

我认为Apache的mod_deflatemod_gzip更常见,因为它是内置的并且做同样的事情。查看mod_deflate(上面链接)的文档,您将看到根据MIME类型指定要压缩的文件类型很容易。通常,压缩HTML,CSS,XML和JavaScript是值得的。图像已经被压缩,因此它们不会受益于压缩。

答案 2 :(得分:4)

浏览器发送一个“Accept-Encoding”标头,其中包含它知道如何理解的压缩类型。服务器与用户代理一起查看此内容并决定如何对结果进行编码。有些浏览器谎称他们能理解什么,所以这比在标题中搜索“deflate”更复杂。

从技术上讲,任何带有内容的HTTP / 2xx响应都可以使用任何有效的内容编码(gzip,zlib,deflate等)进行内容编码,但实际上将压缩应用于常见的图像类型是浪费的,因为它实际上是使它们更大。

您绝对可以压缩动态PHP页面的响应。最简单的方法是添加:

<?php ob_start("ob_gzhandler"); ?>  

到每个PHP页面的开头。当然,最好通过PHP配置进行设置。

有很多测试页面,很容易找到Google