vite + nginx运行前端资源提示ERR_CONTENT_DECODING_FAILED 200 (OK)
1.chrome console异常日志
GET http://x:6601/assets/index-B9lsUMCZ.js net::ERR_CONTENT_DECODING_FAILED 200 (OK)
index.html:9
GET http://x:6601/assets/_plugin-vue_export-helper-BEfAEIvr.js net::ERR_CONTENT_DECODING_FAILED 200 (OK)
index.html:10
GET http://x:6601/assets/useApi-CUgTH_jn-Ddzyv1EW.js net::ERR_CONTENT_DECODING_FAILED 200 (OK)
index.html:11
GET http://x:6601/assets/router-C6CUu5gF.js net::ERR_CONTENT_DECODING_FAILED 200 (OK)
1.1分析
这个报错的关键不是 200 OK,而是:net::ERR_CONTENT_DECODING_FAILED这通常表示 HTTP 响应头声明了压缩,但实际返回的数据无法按声明的方式解压。
你这里是多个 .js 文件同时出现:
1 | index-B9lsUMCZ.js |
所以大概率不是某一个 JS 文件损坏,而是 6601 端口前面的 Web 服务/Gzip 配置有问题。
1.2检测nginx配置
...
location ~* \.js$ {
# 检查是否存在对应的 .js.gz 文件
try_files $uri.gz $uri =404;
# 添加 gzip 头部
add_header Content-Encoding gzip;
# 设置缓存头
add_header Cache-Control "public, max-age=31536000";
# 设置 MIME 类型为 JavaScript
default_type application/javascript;
}
...
# 发现自定义加js头部压缩标签,实际下载js是未压缩的
add_header Content-Encoding gzip;
1.3下载js查看是否压缩(gzip)
在服务器或本机执行:
1 | wget http://x:6601/assets/index-B9lsUMCZ.js |
浏览器会认为服务器返回的是 gzip 数据,但如果服务器实际上返回的是未压缩的 JS,就会直接导致:
1 | ERR_CONTENT_DECODING_FAILED |
1.4解决
...
# 添加 gzip 头部(关闭js压缩添加header)
# add_header Content-Encoding gzip;
....
1.5重启前端服务测试
- pass