强制让Nginx压缩包头中未带GZip的请求
假设你已经把Nginx的GZip压缩配置正常打开了,如果没有的话麻烦先去Google相关资料,以下是针对请求头中未带「Accept-Encoding: gzip」包头时,也让Nginx始终进行GZip压缩并返回的方法。
####通常的方法有两种: * 使用Nginx的第三方模块「headers-more-nginx-module」,优点是功能齐全、配置简单,缺点是要重新编译,对于Yum/Apt安装之类的Nginx有些麻烦。 * 启动两个Nginx进程服务,一个前端修改Header作为反向代理转发,一个作为后端固定会收到GZip包头所以会返回压缩,以下的是这种方法的简化版本。
启动两个Nginx进程太不人性化,所以网上常用的方法是配置两个虚拟主机。但是笔者觉得还是多余了一些,所以对此再作了一些修改,先来看看原始配置:
server {
listen 80;
server_name test.jtwo.me;
root /data/cdnfile;
location ~* \.(?!(php|jsp|asp|aspx)$) {
add_header Access-Control-Allow-Origin *;
add_header Cache-Control "public, max-age=259200";
}
}
然后再来看看,经过笔者多次修改,测试后简化的配置:
upstream test.jtwo.me {
server 127.0.0.1:80;
}
server {
listen 80;
server_name test.jtwo.me;
root /data/cdnfile;
location ~* \.(?!(php|jsp|asp|aspx)$) {
gzip_http_version 1.0;
proxy_set_header Accept-Encoding gzip;
if ($http_accept_encoding !~* "gzip") {
proxy_pass http://test.jtwo.me;
}
add_header Access-Control-Allow-Origin *;
add_header Cache-Control "public, max-age=259200";
}
}
可以看出来实际上就只是多了几行配置,相比重新编译Nginx,或者启动两个虚拟主机要简单吧?笔者现在解释下修改的指令和参数:
upstream test.jtwo.me
这句就不解释了,太简单网上资料很多,通常可以用于负载均衡等作用。
gzip_http_version 1.0
GZip最低的压缩协议,不能使用默认的1.1,因为Nginx转发用的是1.0协议。
proxy_set_header Accept-Encoding gzip
修改转发请求,加上gzip的包头,只修改转发,并不会影响到正常的请求。
if ($http_accept_encoding !~* "gzip")
如果请求过来的包头中未匹配到gzip关键字,则进入if的逻辑,进行转发。
proxy_pass http://test.jtwo.me
转发到虚拟主机的域名,这个就是server区域的server_name,不要搞错。
####参考资料: * Headers More Nginx Module * Nginx始终返回GZip压缩内容的方法 * 从Nginx默认不压缩 HTTP/1.0 说起