检测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对于前台的页面并没有做任何压缩处理。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<br />
[admin@huangye ~]$ telnet ihacklog.com 80<br />
Trying 174.36.139.53...<br />
Connected to ihacklog.com.<br />
Escape character is '^]'.<br />
GET /memory/hacklog/piano-of-night-5.html HTTP/1.1<br />
HOST: ihacklog.com<br />
Accept-Encoding:gzip,deflate</p>
<p>HTTP/1.1 200 OK<br />
Transfer-Encoding: chunked<br />
Date: Sun, 16 Oct 2011 06:19:15 GMT<br />
Server: LiteSpeed<br />
Connection: close<br />
X-Powered-By: PHP/5.2.17<br />
Set-Cookie: notify_cookie=cb5a128319994c31b4c1adfdc12b50f3; expires=Tue, 15-Nov-2011 06:19:39 GMT<br />
X-Pingback: http://ihacklog.com/wordpress/xmlrpc.php<br />
Content-Type: text/html; charset=UTF-8<br />
Link: <http://ihacklog.com/?p=4933>; rel=shortlink<br />
Content-Encoding: gzip<br />
Vary: Accept-Encoding</p>
<p>1000<br />
H��������[V��Zt�� �9������GBB�`��s���l�z���{oU��-��68���5�jUU��ԭ[�nUݪ���Җ77���έ$o�sϦ��6���oٽ������I4!�5��ˆ�y%��F���Q����BS<br />
...此处省略一堆字符<br />

从上面的服务器返回信息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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<br />
[admin@huangye ~]$ telnet huangye.com 80<br />
Trying 172.30.16.31...<br />
Connected to huangye.com.<br />
Escape character is '^]'.<br />
GET /?p=1 HTTP/1.1<br />
HOST: huangye.com<br />
Accept-Encoding: gzip,deflate</p>
<p>HTTP/1.1 200 OK<br />
Date: Sun, 16 Oct 2011 06:29:34 GMT<br />
Server: Apache/2.2.21 (Unix)<br />
Set-Cookie: notify_cookie=4f0d285ef552d1c65008ad4c6ae218f3; expires=Tue, 15-Nov-2011 06:29:52 GMT<br />
X-Pingback: http://huangye.com/wordpress/xmlrpc.php<br />
Transfer-Encoding: chunked<br />
Content-Type: text/html; charset=UTF-8</p>
<p>202c<br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br />
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="zh-CN"></p>
<p><head profile="http://gmpg.org/xfn/11"><br />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></p>
<p><title><br />
                          世界,你好! &raquo; 荒野无灯&#039;s weblog                                 </title></p>
<p>

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[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<GB6�y�T%5�&#038;@����)W�2Ø+�J&#038;CתZᴢ陏穌帚渓溯我ጉ⥼⤯祤林茴稟ⵠ妊滌ⵉ徠ܥば綣欒函㜇紐暘簵騙Эⱽ会賣鞐扼襷兢諂礙鵠畦猗袗
此处省略一堆字符...

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

最后,简单说下原理:

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

1
Accept-Encoding: gzip, deflate

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

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

1
Content-Encoding: gzip

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

更多
8 Responses Post a comment
  1. 闲云野鹤

    技术流就是不一样啊!实践是检验真理的唯一标准!

  2. 河河

    原来你是WP中文论坛的版主!!我在里面混了好长时间了,哈哈

  3. 荒野无灯

    @依云
    那是当然,不过在没有权限配置服务器的情况下,用插件也不失为一种方法。

  4. 依云

    我觉得有可能的话,这个交给HTTP服务器做更好,毕竟人家是专门干这个的。

  5. 荒野无灯

    @phoetry
    呃,呵呵,很久前注册的id,admin一直不接受改id的,我也就没跟他说。
    是的,wp前台一直就没有压缩这回事。

  6. phoetry

    默認前臺原本就不是gzip壓縮的吧, 畢竟不是所有瀏覽器都支持的, 何況這種較大的變故官方changelog不可能不提到.
    原來無燈是插件區斑竹, 久仰久仰, 哈哈.

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS