但这里就有个怪点子,能不能让客户端无论有没有发送Accept-Encoding,服务器都会发送压缩内容呢?
这有几个好处:
1、进一步节省带宽。
2、防止水平一般的爬虫抓页面偷数据。
经测试,此种做法并不会影响普通用户,因为他们都是用先进的浏览器上网的;另外,也不会影响主流的搜索引擎,收录仍然会正常。
要做到这点,需要有两个nginx,但也有办法配置两个虚拟主机就可以,不用启动两个nginx主进程。为了方便,我就以前后来区分它们。
前端nginx:
gzip压缩不在前端nginx进行,前端主要是用来强制修改request header,即写上:
- proxy_set_header Accept-Encoding ‘gzip’;
这样,后台的nginx无论如何都将接收到Accept-Encoding:gzip,而不管客户端有没有发。
完整的测试样本:
- server 127.0.0.1:80;
- }
- server {
- server_name www.gznow.org;
- listen 80;
- location / {
- proxy_pass http://219.x.x.x;
- include proxy.conf;
- proxy_set_header Accept-Encoding ‘gzip’;
- }
- }
要注意proxy.conf里最好没有写过proxy_set_header Accept-Encoding,我的proxy.conf默认有将Accept-Encoding设为空的,这会造成配置重复。但proxy_set_header不会冲突,可以按配置先后顺序生效,我一时忘了是前生效还是后生效,动手测一下便知。
后端nginx:
后端nginx才是负责压缩的,这里要注意gzip的版本,因为nginx是用http1.0方式作代理,因此gzip的版本就不能是默认的1.1版,改成1.0。
- server {
- server_name www.gznow.org;
- listen 80;
- location / {
- root /html/;
- gzip on;
- gzip_http_version 1.0;
- }
- }
这里就简单点了,gzip的其他参数我就不贴上来,想必大家都有现成的配置,留意下version就好。
配好后,测试一下:
发现返回了Content-Encoding:gzip
不加-I参数呢?
打印出一堆乱码,把SecureCRT的字符都给弄坏了。
也可以通过以下工具来测试压缩成效 http://gzip.zzbaike.com/


