问题描述
部署到生产环境的系统,系统初始化加载打包文件或者静态文件,报:
1、Refused to execute script from ‘XXXX’ because its MIME type (‘text/html’) is not executable, and strict MIME type checking is enabled.
2、Refused to applye style from ‘XXXX’ because its MIME type (‘text/html’) is not a supported stylesheet MIME type, and strict MIME type checking is enabled.
这两个问题,导致系统一直在loading中。
问题分析
发现报错原因是加载的css、js文件返回的Content-Type为text/html,与文件的类型.js、.css不匹配,导致文件被禁止加载了。报错截图如下:
之前系统运行时正常的,然后运维同学在Nginx的响应头增加了X-Content-Type-Options:nosniff字段之后,系统就报错了。
前端接收到服务器发送的响应头为
X-Content-Type-Options: nosniff,则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应。这是一种安全功能,有助于防止基于 MIME 类型混淆的攻击。
简单理解为:通过设置"X-Content-Type-Options: nosniff"响应标头,对 script 和 styleSheet 的执行是通过MIME类型来过滤掉不安全的文件。
因此已经找到问题所在了,因为服务器返回的.css、.js文件的Content-Type为text/html,而.css文件返回的Content-Type应该为"text/css",.js文件返回的Content-Type应该为"application/x-javascript"。
问题解决方案
解决方案1:联系运维同学将Nginx的X-Content-Type-Options头部字段去掉或者关掉;
解决方案2:规范化、标准化Content-type格式,参考:tool.oschina.net/commons