下载的 zip 只有 2MB,源文件实际 8MB,解压报压缩文件已损坏,用 curl 直接下到服务器上却是好的,只有经过 Nginx 的请求出问题。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
location ~* \.(zip|7z|gz|rar)$ {
gzip off;
}
zip 本来已经压缩过,Nginx 又对它启用了 gzip,响应头和实际字节数不一致,浏览器按 Content-Length 截断。下载器拿到的是半截文件。这一点先确认清楚,后面就不用反复试。
「gzip 压缩下载」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,下载路径关闭 gzip,zip 和 7z 这类文件不需要再压;响应头补上准确的 Content-Length,别用 chunked 混着发;下载后比对文件大小和 sha256,与源文件一致。
改完照着核一遍,zip 下载后大小与源文件一致,解压不再报损坏。
