【问题标题】:How does server side GZipping work?服务器端 GZipping 是如何工作的?
【发布时间】:2009-08-09 18:22:00
【问题描述】:

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

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

Silverlight 或 Flash 等平台在下载此类数据时会被浏览器/运行时自动压缩/解压缩吗?有什么方法可以测试吗?

【问题讨论】:

    标签: webserver gzip content-encoding


    【解决方案1】:

    这仅适用于 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 文件,而不是图像。


    如果您希望以相同方式压缩逗号分隔的数据,则必须将其内容类型或扩展名添加到您的网络服务器的配置中,以便为其激活 gzip 压缩。

    有什么方法可以测试吗?

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

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

    Silverlight 或 Flash 等平台呢? 当他们下载此类数据时,是否会对其进行压缩/解压缩 由浏览器/运行时自动执行?

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

    【讨论】:

    • 只是为了向未来的读者澄清:任何类型的 HTTP 数据都可以被压缩,句号。对于已经压缩的数据(例如图像)来说,这只是一个坏主意。
    • @Sean > 完全正确;我想知道是否可以通过重新压缩图像来获得任何好处,顺便说一句......从来不敢测试它^^(我猜这个增益会非常简约,如果不是空的话,它会消耗相当多的 CPU 几乎没有...... )
    • Ergh :-( 在网上看到 bmp 好难过 :-( (但还是很有趣,看到那些负载 slooooowwwly...)
    • 要回答您关于 Silverlight 和 Flash 的问题,如果它们发送 Accept 标头表明它们支持压缩内容,Apache 将使用 mod_deflate 或 mod_gzip。如果他们不支持压缩,他们将不会发送标头。它会“正常工作”。
    【解决方案2】:

    我认为 Apache 的 mod_deflatemod_gzip 更常见,因为它是内置的并且做同样的事情。查看mod_deflate 的文档(上面链接),您会发现根据 MIME 类型指定要压缩的文件类型很容易。一般来说,压缩 HTML、CSS、XML 和 JavaScript 是值得的。图像已被压缩,因此无法从压缩中受益。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 2018-11-13
        • 2012-05-05
        • 2021-04-16
        相关资源
        最近更新 更多