服务器端 Gzip 压缩是如何工作的?

7
你可能知道,与HTML相关的文件格式在服务器端使用GZip压缩(由Apache服务器上的mod_gzip完成),并由兼容的浏览器进行解压缩。(“内容编码”)
这只适用于HTML/XML文件吗?假设我的PHP/Perl文件生成一些简单的逗号分隔数据,并将其发送到浏览器,它会默认进行编码吗?
那么像Silverlight或Flash这样的平台,在下载这些数据时,浏览器/运行时会自动进行压缩/解压缩吗?有没有办法测试这个?
3个回答

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的扩展 Firebug LiveHTTPHeaders都是必备的。
对于不通过浏览器的标准通信方式传输的内容,可能会更难一些;最终,您可能不得不使用类似 Wireshark的东西来“嗅探”实际通过管道传输的内容...祝你好运!

关于Silverlight或Flash这样的平台,当它们下载这些数据时,浏览器/运行时会自动压缩/解压缩吗?

回答关于Silverlight和Flash的问题,如果它们发送一个支持压缩内容的Accept头,Apache将使用mod_deflate或mod_gzip进行压缩/解压缩。如果它们不支持压缩,它们将不会发送头信息。这将“自动工作”。- Nate


6
为了向未来的读者澄清:任何类型的HTTP数据都可以被压缩,这是毋庸置疑的。但对于已经压缩过的数据,比如图片,进行再次压缩并不是一个好主意。 - Sean Reilly
@Sean > 没错;顺便问一下,重新压缩图像会有什么好处吗?我从来没有敢尝试过^^(我猜收益会非常微小,甚至为零,而且几乎不会带来任何CPU消耗...) - Pascal MARTIN
唉 :-( 在网上看到bmp真是太伤心了 :-( (但还是很有趣,看着它们加载得那么慢...) - Pascal MARTIN
2
回答关于Silverlight和Flash的问题,如果它们发送了指示支持压缩内容的Accept标头,Apache将使用mod_deflate或mod_gzip。如果它们不支持压缩,它们将不会发送标头。它将“只是起作用”。 - Nate

5
我认为Apache的mod_deflatemod_gzip更常见,因为它是内置的并且可以做同样的事情。查看mod_deflate的文档(上面链接的)可以很容易地指定哪些文件类型需要基于其MIME类型进行压缩。通常值得压缩HTML、CSS、XML和JavaScript。图像已经被压缩过了,所以不会从压缩中受益。

4
浏览器会发送一个"Accept-Encoding"头,其中包含它知道如何理解的压缩类型。服务器查看此内容以及用户代理,并决定如何对结果进行编码。一些浏览器会虚报自己能够理解的内容,因此这比在头部中搜索"deflate"更加复杂。
从技术上讲,任何带有内容的HTTP/2xx响应都可以使用任何有效的内容编码(gzip、zlib、deflate等)进行内容编码,但实际上对常见图像类型应用压缩是浪费的,因为它实际上会使它们变得更大。
你肯定可以压缩动态PHP页面的响应。最简单的方法是添加:
<?php ob_start("ob_gzhandler"); ?>  

在每个PHP页面的开头添加此代码。当然,最好通过PHP配置进行设置。

有许多测试页面可以轻松地通过Google找到:


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