X-Content-Type-Options 设置了 nosniff 为啥浏览器还是能加载 JS?
我在 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 控制台没报错,脚本照常运行……这不就绕过安全策略了吗?
你这种情况,如果
<script>标签明确引用了这个 JS 文件,即使服务器返回的是 text/plain,现代浏览器还是会执行。因为<script>标签本身就是用来加载和执行 JavaScript 的。如果你想完全阻止这种行为,除了 nosniff,还得确保 Content-Type 正确设置为 application/javascript。而且最好从源头上保证静态资源的 MIME 类型正确。
一般这样处理:
在 Nginx 配置中,针对 js 文件单独设置正确的 MIME 类型
这就能从根本上解决问题了。记得重启 Nginx 生效配置。调试的时候多用 Chrome 网络面板看实际响应头,别光看控制台输出。