问题概述
当Nginx服务器已配置Gzip压缩,浏览器访问时却未显示Content-Encoding: gzip响应头,而使用curl命令测试则正常。本文将详细分析这一现象的原因并提供解决方案。
TL;DR:
你可能并不关心下面冗长的详细排查过程,长话短说,如果你出现了和我一样的问题,很可能是你使用的某款防病毒软件(如ESET)导致的。请尝试关闭 HTTP 保护。对于Eset,可以尝试类似操作:高级 -> Internet 和电子邮件 -> Web 访问保护 - 关闭。
详细排查过程
贴下nginx关键配置如下,主要是http模块下gzip相关的配置项,其它配置忽略:
http {
gzip on;
gzip_static on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
Chrome浏览器请求头包含Accept-Encoding: gzip,但响应头缺少Content-Encoding: gzip
请求头如下(Host是我的云服务器IP,脱敏了):
GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
DNT: 1
Host: x.x.x.x
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
响应头如下:
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Date: Thu, 29 May 2025 07:29:19 GMT
Content-Type: text/html
Last-Modified: Fri, 16 May 2025 07:39:18 GMT
Connection: keep-alive
Vary: Accept-Encoding ETag: "6826eba6-11e"
Accept-Ranges: bytes
X-Content-Encoding-Over-Network: gzip
Transfer-Encoding: chunked
可以看到,响应头并未包含Content-Encoding: gzip,而且从Network面板可以看到请求的大小也和压缩前的大小一致,说明确实没有应用上gzip压缩传输。
到了这一步,首先怀疑的是不是nginx配置有什么问题,反复检查了配置项好像确实没什么问题,那有没有可能是客户端出了问题呢?
我现在使用的Chrome浏览器,我先后尝试了firefox、safari以及一些如360、夸克等国产浏览器,都是一样的结果。
会不会是浏览器的问题呢,用curl发请求试试。只需要获取响应头可以使用-I参数,同时可以使用-H指定请求头来模拟和浏览器一样的请求头。请求结果如下:
可以看到在模拟了和浏览器一样的请求头的情况下,curl命令返回的响应头是包含了Content-Encoding: gzip标头的,而且Content-Length: 286也与文件gzip后的大小一致。这说明确实不是nginx的问题,是浏览器的问题。
尝试问了下DeepSeek,但它的回答并不能解决我的问题:
重新检查浏览器中的Response Headers,发现有个标头比较可疑:X-Content-Encoding-Over-Network: gzip,之前没见过,搜索这个关键词,找到了github的这条issue
评论中说是ESET导致的,这是一款防病毒软件。巧了,我公司的电脑确实预装了ESET。但是我不能像评论里一样在ESET里关闭选项,因为我没有权限。
尝试用家里的Mac电脑浏览器访问,发现确实是正常的。破案。
解决方案
- 关闭安全软件的"Web访问保护"功能
- 或将该网站加入安全软件的白名单