X-Content-Type-Options 设置了 nosniff 为啥浏览器还是能加载 JS?

一东旭 阅读 19

我在 Nginx 里加了 X-Content-Type-Options: nosniff,但发现有些 JS 文件 MIME 类型明明是 text/plain,浏览器居然还能执行,不是说 nosniff 会阻止这种行为吗?是不是我哪里配错了?

我的 Nginx 配置大概是这样的:

add_header X-Content-Type-Options "nosniff" always;
add_header Content-Type "text/plain" always;

结果 Chrome 控制台没报错,脚本照常运行……这不就绕过安全策略了吗?

我来解答 赞 12 收藏
二维码
手机扫码查看
1 条解答
南宫广利
X-Content-Type-Options: nosniff 主要是防止浏览器基于 MIME 类型推测文件类型,但有个前提:浏览器要先根据 URL 或者其他上下文判断这个资源应该是脚本才行。

你这种情况,如果 <script> 标签明确引用了这个 JS 文件,即使服务器返回的是 text/plain,现代浏览器还是会执行。因为 <script> 标签本身就是用来加载和执行 JavaScript 的。

如果你想完全阻止这种行为,除了 nosniff,还得确保 Content-Type 正确设置为 application/javascript。而且最好从源头上保证静态资源的 MIME 类型正确。

一般这样处理:
在 Nginx 配置中,针对 js 文件单独设置正确的 MIME 类型
location ~* .js$ {
add_header X-Content-Type-Options "nosniff";
default_type application/javascript;
}

这就能从根本上解决问题了。记得重启 Nginx 生效配置。调试的时候多用 Chrome 网络面板看实际响应头,别光看控制台输出。
点赞
2026-03-26 04:08