今天请求一个http接口时,提示出错,但是后端服务器没有异常日志,console控制台发现如下的错误
net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK),google来的都是nginx上的静态资源没权限之类的,与本场景不符,这个错误的意思大致是内容长度不匹配,可能涉及到了报文长度的问题,network看了下这个接口,发现返回内容是其他接口的几十倍,由此基本可推测响应报文过长导致的
看下这个请求的详细参数
其请求头的Accept-Encoding: gzip表示客户端告诉服务器,当前浏览器支持压缩编码
gzip
gzip 压缩指的是 http 采取的压缩编码方式,属于 http 内容编码的一种,采取 gzip 压缩编码可以减小 http 传输的内容,从而提高响应速度和首屏渲染速度。现在的浏览器基本都支持 gzip 压缩,所以开启 gzip 是优化用户体验的重要方式之一
但是这里响应头的Content-Length: 523358而不是Content-Encoding: gzip,即服务器没采用压缩方式返回报文主体
具体流程
- 浏览器发送请求到服务器,请求头中 Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持 gzip、deflate 压缩)
- 服务器收到请求后,生成 Response, 其中有 Content-Type 和 Content-Length。
- 服务器进行 Gzip 压缩,对响应体进行压缩,修改 Content-Length, 响应头中增加 Content-Encoding:gzip
- 浏览器收到响应后,根据 Content-Encoding:gzip 来对 Response 进行解码
解决办法
nginx开启gzip即可,相关指令位于http{…}两个大括号之间
开启gzip后
可见开启了gzip,返回实体小了10倍