直接配置 add_header X-Content-Type-Options "nosniff" always; 于 Nginx 的 http 或 server 块中,可全局禁用浏览器 MIME 嗅探,确保所有状态码响应(含304、404)均携带该头,且值必须严格为小写 nosniff。

直接在 Nginx 配置中添加 X-Content-Type-Options: nosniff 即可禁用浏览器的 MIME 嗅探行为,关键是要确保它出现在所有静态资源(JS、CSS、图片、字体、JSON 等)的响应头中,且必须带 always 参数。
推荐配置位置:全局生效最稳妥
把头信息加在 http 或 server 块里,避免遗漏任何资源类型:
- 在
http块中添加(影响全部虚拟主机):add_header X-Content-Type-Options "nosniff" always; - 在
server块中添加(仅作用于当前站点):add_header X-Content-Type-Options "nosniff" always;
使用 always 是重点——它能保证该响应头出现在 200、304、404、500 等所有状态码的响应中。不加时,重定向或错误页可能漏掉这个头,留下安全隐患。
为什么不能只配在 location 块里
有人习惯按文件后缀匹配配置,例如:
location ~ \.(js|css|png|jpg|woff2)$ { add_header X-Content-Type-Options "nosniff"; }
这种写法有明显缺陷:
– 没加 always,304 响应不会携带该头;
– 后缀列表容易遗漏(比如 .svg、.json、.webp、.ttf、.map);
– 动态生成的资源(如 PHP 输出的 JS 或 CSS)可能不走这个 location 规则。
验证是否真正生效
别只检查 HTML 页面的响应头,必须逐个检查实际加载的静态资源:
- 打开浏览器开发者工具 → Network 标签页;
- 刷新页面,找到一个 .js 文件(如 main.js),点击查看 Headers → Response Headers;
- 确认存在
X-Content-Type-Options: nosniff,且值为小写 nosniff(大小写敏感,NOSNIFF或no-sniff无效); - 同样检查 .css、.png、.woff2 等至少三类资源,确保全部覆盖。
常见误区提醒
这个头不是 HTML 标签或 meta 元素,无法通过前端代码设置;
它也不是用来防止 XSS 的主防线,而是配合 Content-Type 起作用——如果服务器返回 Content-Type: text/plain 却被当 JS 执行,nosniff 就能阻止这种误判;
旧版 IE 支持 nosniff=1,但现代标准只认 nosniff,其他变体一律忽略。


















