检测Gzip压缩——由一句评论引发的文章 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

检测Gzip压缩——由一句评论引发的文章

说下写这篇文章的原因。
WP中文论坛某童鞋发一了帖子,名为《推荐的10款 WordPress 插件》,其中有推荐到一个页面压缩插件:gzippy

于是有人开喷了:

35582944 夜色倾城 说:
这种复制的老文章就不要转了

呃,他居然一眼把此文章认定为别人复制的,好吧,虽然我是版主,这些事情我是不管的,只要你不违反版规什么的。
楼主的回复:

然后,他开始误导群众了:

作为插件区的版主,我实在看不下去这种误导广大人民群众的,于是忍不住加了一句评语。然后我解释给他听:

sejie10011 发表于 2011-10-15 16:30
wp后台的load-script是通过gzip 压缩内容后再发送的,这个不假。
前台页面内容是没有压缩的。

后来他又回帖了,语气非常D坚定,我就不用形容词了啊,各位,还有,后来他又编辑了上面的回帖,令我把积分还他(见上图)。

35582944 夜色倾城 说:

http://tool.chinaz.com/Gzips/

你去查查到底有没有开



好吧,这里我就把方法说一说,以证明我不是信口雌黄。

一般情况下,没有八九成的把握我是不会出口的。其实在我评论之前,我是特意看了下WordPress 3.2.1的源码的,观其源码,只看到后台通过load-scritps.php加载的js或css文件,基本上是通过gzip压缩的。WordPress对于前台的页面并没有做任何压缩处理。

也许我这样说还有人会不信,那么请看下文:
先拿我自己的博客来做测试:

[admin@huangye ~]$ telnet ihacklog.com 80
Trying 174.36.139.53...
Connected to ihacklog.com.
Escape character is '^]'.
GET /memory/hacklog/piano-of-night-5.html HTTP/1.1
HOST: ihacklog.com
Accept-Encoding:gzip,deflate

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sun, 16 Oct 2011 06:19:15 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: PHP/5.2.17
Set-Cookie: notify_cookie=cb5a128319994c31b4c1adfdc12b50f3; expires=Tue, 15-Nov-2011 06:19:39 GMT
X-Pingback: http://ihacklog.com/wordpress/xmlrpc.php
Content-Type: text/html; charset=UTF-8
Link: ; rel=shortlink
Content-Encoding: gzip
Vary: Accept-Encoding

1000
H��������[V��Zt�� �9������GBB�`��s���l�z���{oU��-��68���5�jUU��ԭ[�nUݪ���Җ77���έ$o�sϦ��6���oٽ������I4!�5��ˆ�y%��F���Q����BS
...此处省略一堆字符

从上面的服务器返回信息Content-Encoding: gzip 及后面那一堆乱码可以看出,页面内容是经过gzip压缩的。
但是这样就能断定wordpress自身对页面进行压缩了吗?非也。

要对页面进行压缩后再发送,至少有三种方法。
其一,通过http服务器配置实现,其二,通过php.ini来实现,其三,通过PHP代码实现
可见,若要判断是不是wp自身对页面内容进行了压缩,必须先排除前二者。

下面开始干活了。
测试环境:
LAMP(Linux + Apache + Mysql + PHP )
WordPress 3.2.1 官方中文版
本地域名: huangye.com ,指向本机ip.
配置Apache,不开启页面压缩,配置php.ini默认关闭压缩,安装好wp,默认不启用任何插件。
然后,打开shell:

[admin@huangye ~]$ telnet huangye.com 80
Trying 172.30.16.31...
Connected to huangye.com.
Escape character is '^]'.
GET /?p=1 HTTP/1.1
HOST: huangye.com
Accept-Encoding: gzip,deflate

HTTP/1.1 200 OK
Date: Sun, 16 Oct 2011 06:29:34 GMT
Server: Apache/2.2.21 (Unix)
Set-Cookie: notify_cookie=4f0d285ef552d1c65008ad4c6ae218f3; expires=Tue, 15-Nov-2011 06:29:52 GMT
X-Pingback: http://huangye.com/wordpress/xmlrpc.php
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

202c


<br /> 世界,你好! » 荒野无灯's weblog

看到什么了?现在返回的东西是纯html代码,而不是gzip压缩后的内容,这说明,wp3.2.1并没有对页面进行压缩。好了,真相大白。

然后,我们再安装GZIP Output这个插件(插件主页:http://austinmatzko.com/2008/02/22/wordpress-gzip-plugin/),在后台搜索并安装即可,如要手动下载,请至这里:http://wordpress.org/extend/plugins/gzip-pages/

安装好这个插件后再做如下测试:

[admin@huangye ~]$ telnet huangye.com 80
Trying 172.30.16.31...
Connected to huangye.com.
Escape character is '^]'.
GET /?p=1 HTTP/1.1
HOST: huangye.com
Accept-Encoding: gzip,deflate

HTTP/1.1 200 OK
Date: Sun, 16 Oct 2011 06:43:01 GMT
Server: Apache/2.2.21 (Unix)
Set-Cookie: notify_cookie=4f0d285ef552d1c65008ad4c6ae218f3; expires=Tue, 15-Nov-2011 06:43:22 GMT
X-Pingback: http://huangye.com/wordpress/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 3702
Content-Type: text/html; charset=UTF-8

�lf��ص�ƒ��T�@����b�,�\���4�hf�ö��$�8�s,!asl^1[��8N�a���O��}��C��#
                                                                     (��g�������t��WGRJQ�W�#�G�_^�|�ʤФ�MW�t�Ć��������هevv6=;����2yB��X:Y4S^bfZ�4�Лc
��o���%��N^2

有些可见,在服务器没有开启gzip压缩的情况下,gzippy和GZIP Output这类插件的作用是相当可观的。
启用插件后用在线工具(http://www.gidnetwork.com/tools/gzip-test.php) 检测下压缩比率你就知道了。

最后,简单说下原理:

在做到检测某网站是否开启GZIP时,客户端在请求的时候,要带

Accept-Encoding: gzip, deflate

代表客户端支持 gzip 这种编码的传输方式.
然后服务器才会根据自身是否开启 gzip压缩来响应.
上面我用telnet连接服务器的80端口,实际上是模拟浏览器访问http服务器,因为直接用浏览器访问,不管对方服务器有没有开启gzip压缩,你都能看到页面的内容。用telnet就比较直观了,因为telnet可不会自动帮你解gzip压缩后的内容。

若内容是gzip压缩过的,那么服务器在响应头中会加上这一句:

Content-Encoding: gzip

ps:有些服务器对内容进行 gzip 编码只针对某些文件,所以有没有返回这个,并不能作为该http服务器是否支持gzip的依据.

Tagged in :

All Comments (0)
Gravatar image
No Comments