文档章节

deflate——过时的网页压缩格式,最好禁用

徐学良
 徐学良
发布于 2017/02/14 13:38
字数 1328
阅读 32
收藏 0
点赞 0
评论 0

在设置GZip时,发现同时有个Deflate压缩设置,一开始并不了解Deflate压缩,于是便在启用GZip的同时,也启用了Deflate压缩。虽然同时设置GZip和Deflate压缩,并不影响网站的正常运行,并且在检测网站是否启用GZip时,返回的答案是已启用。但是我们能否不设置Deflate压缩呢?或者来说,需要禁用Deflate压缩呢?Deflate压缩又有什么好处和坏处?带着这一堆疑问,我今天查了一些资料,大概了解了一些,最后得到的结论是:DEFLATE——过时的网页压缩格式,最好禁用。

了解GZip和deflate

GZIP,好像是一个不透明的或原子的功能。事实上,HTTP定义了一种机制,一个Web客户机和Web服务器同意一压缩方案可以用来发送内容,这由使用Accept-Encoding和Content-Encoding标头完成。有两种常用的HTTP压缩:DEFLATE和GZIP。

DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩,有众多开源的实现算法。该标准的实施库大多数人用的是zlib的。zlib库提供用于压缩和解压缩使用DEFLATE/INFLATE的数据。zlib库还提供了一种数据格式,混淆的命名ZLIB,它包装DEFLATE压缩数据,具有报头和校验和。

GZIP是使用DEFLATE进行压缩数据的另一个压缩库。事实上,GZIP的大多数实现实际使用zlib库的内部进行DEFLATE/ INFLATE压缩操作。GZIP产生其自己的数据格式,混淆的命名GZIP,它包装DEFLATE压缩数据,具有报头和校验和。

早期浏览器对DEFLATE压缩描述混乱

HTTP/1.1 RFC(超文本传输协议HTTP/1.1版)在为Accept-Encoding和Content-Encoding标头描述允许的压缩方案时做得不好,它定义了Content-Encoding:gzip,该响应体由使用GZIP数据格式(GZIP标头,压缩数据,和校验和)组成。它还定义 Content-Encoding:DEFLATE,但是,尽管它的名字,这并不意味着响应体是DEFLATE压缩数据的原始块。根据RFC-2616,DEFLATE和Content-Encoding:DEFLATE,实际上意味着响应体是由zlib的格式(zlib的头,压缩数据和校验)组成的。

这种“DEFLATE的标识并不意味着原始DEFLATE压缩数据”的想法是相当混乱的。早期版本的Microsoft的IIS Web服务器被编程为返回原始DEFLATE压缩数据的Accept-Encoding::deflate要求,而不是一个zlib的格式的响应。而在与Content-Encoding时期望的响应自然版本的Internet Explorer:DEFLATE标头有原始DEFLATE响应主体。

Mark Adler,zlib的作者之一,介绍说:

早期的微软服务器会错误地提供“Deflate”的原始压缩(例如RFC1951的数据没有RFC1950的zlib包装)。这导致的问题是,浏览器不得不去试一下两种方式,在最后它只是使用更可靠的GZIP。

现在浏览器对DEFLATE压缩处理不好

如Mark所说,浏览器收到Content-Encoding后,压缩必须处理两种可能的情况:响应主体是原始DEFLATE数据,或响应主体是zlib包装过的DEFLATE响应。那么,现代浏览器处理DEFLATE或zlib包装过的DEFLATE响应效果有多好?Verve工作室测试了一个庞大的浏览器数量,结果并不好。

表中的部分结果意味着浏览器处理原始DEFLATE或zlib包装过的DEFLATE不一致,这其实是另一种说法“它被破坏了,功能不正常了。”这似乎是一个棘手的错误,而浏览器创造者不断重新引入到他们的产品中。 Safari浏览器5.0.2?没问题。 Safari浏览器5.0.3?彻底失败。 Safari浏览器5.0.4?没问题。 Safari浏览器5.0.5?不一致和被破坏。

发送原始DEFLATE数据不是一个好主意,正如马克说,“[它]只使用更可靠的GZIP。”

还应该注意的是,所有支持DEFLATE的浏览器都支持GZIP,但不是所有支持GZip的浏览器都支持DEFLATE。有些浏览器,如Android,在它们的Accept-Encoding请求头不包含deflate压缩。由于你不得不配置你的Web服务器使用GZIP,你还不如避免Content-Encoding: deflate。

禁用DEFLATE

幸运的是,避免DEFLATE并不那么困难。

Apache处理所有HTTP压缩的模块是mod_deflate模块。尽管它的名字,mod_deflate模块根本不支持deflate。要得到一个发送原始DEFLATE或zlib包装过的DEFLATE的Apache2版本是不可能。 Nginx的,如Apache,不支持deflate的,它只会发送gzip压缩的响应,发送Accept-Encoding:deflate请求头将导致未压缩的响应。

微软的IIS Web服务器可以同时发送gzip和deflate的响应,你可以分别启用或禁用每个方案。对于IIS6,你可以编辑metabase来禁用DEFLATE支持。对于IIS7,您可以通过编辑.config 文件里的 <httpCompression>元素的<schemes>的DEFLATE压缩方案部分禁用DEFLATE。

如果你的Web服务器发送压缩的DEFLATE内容,无论免费还是商业的产品都具有内置的检测,“过时的压缩格式”。

© 著作权归作者所有

共有 人打赏支持
徐学良
粉丝 22
博文 196
码字总数 13841
作品 0
浦东
程序员
2017前端性能优化清单

2017前端性能优化清单 你开始使用渐进启动了么?是不是已经使用过React和Angular中tree-shaking和code-splitting两个工具?有没有用过Brotli、Zofli和HPACK这几种压缩技术,或者OCSP协议(在...

Edwan ⋅ 2017/01/16 ⋅ 0

压缩算法java

本文将会对常用的几个压缩算法的性能作一下比较。结果表明,某些算法在极端苛刻的CPU限制下仍能正常工作。 文中进行比较的算有: JDK GZIP ——这是一个压缩比高的慢速算法,压缩后的数据适合...

强子哥哥 ⋅ 2015/09/18 ⋅ 0

hadoop深入研究:(七)——压缩

转载请标明出处:hadoop深入研究:(七)——压缩 文件压缩主要有两个好处,一是减少了存储文件所占空间,另一个就是为数据传输提速。在hadoop大数据的背景下,这两点尤为重要,那么我现在就先来...

lastsweetop ⋅ 2013/06/24 ⋅ 0

Apache ——飞机中的战斗机

Apache 在互联网中浏览网页都需要使用HTTP(超文本传输协议),而Apache只是HTTP协议的一个实现程序 , HTTPD作为其主程序运行,目前常用有两个版本CentOS6(httpd 2.2)、CentOS7 (httpd 2.4...

JyingHZ ⋅ 05/25 ⋅ 0

HTTPS, SPDY和 HTTP/2性能的简单对比

中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权,转载请注明来源,谢谢! Firefox 35这周发布了,成为第一个...

天马行空的鱼 ⋅ 2016/03/21 ⋅ 0

在Tomcat上直接配置GZIP压缩

之前我写了两篇关于apache的mod_deflate模块 的文章 关于moddeflate安装的问题处理 使用moddeflate提升网页浏览的速度 这两篇文章主要介绍在apache http server下如何使用mod_deflate模块来压...

红薯 ⋅ 2008/10/05 ⋅ 0

linux 备份、压缩、加密

tar -cvf - /home tar -xvf - 说明:把/home 拷贝到当前目录下,管道前半句把/home打包放到标准输出流中,后半句是把输入流-里的内容解包到当前目录。 tar是Linux常见的一种归档文件(原生不...

SibylY ⋅ 2015/12/09 ⋅ 0

Apache启用mod_deflate的gzip压缩

服务器带宽不够的情况下,可以使用apache启用mod_deflate的GZIP压缩网页传输。gzip原本是文件压缩格式,扩展名为.gz,HTTP协议用它来改进WEB应用程序性能,加快HTTP请求返回内容的下载速度,...

十七亮 ⋅ 2013/02/25 ⋅ 0

apache加载模块

之前因LNMP中PHP的稳定性不高,另外htacess有些方式不支持,今天在虚拟机上装了LAMP,发现apache没有moddeflate、modexpires、mod_headers模块。所以决定自已来编译加载这三个模块。这两个模...

foolbenben ⋅ 2012/09/03 ⋅ 0

java压缩算法

JDK GZIP ——这是一个压缩比高的慢速算法,压缩后的数据适合长期使用。JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的实现。 JDK deflate ——这是JDK中的又一个算...

Jack_Q ⋅ 2015/06/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 19分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 20分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 21分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 35分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 40分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 42分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 42分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 43分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 43分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部