启用 X-Content-Type-Options: nosniff 需先加载 mod_headers 模块,再在 VirtualHost 或全局配置中用 Header always set 指令严格设置小写 "nosniff",并针对 JS/CSS 文件验证生效。

直接在 Apache 中启用 X-Content-Type-Options: nosniff 能有效阻止浏览器对 JS、CSS 等资源进行 MIME 类型嗅探,避免因类型误判导致的 XSS 风险。关键不是“加一行头”,而是确保模块加载、作用域正确、值严格且覆盖所有目标响应。
必须先启用 mod_headers 模块
Apache 不默认激活该模块,未启用时所有 Header 指令会被静默忽略——配置无报错,但实际无效。
- Debian/Ubuntu 系统执行:
a2enmod headers && systemctl reload apache2 - RHEL/CentOS 检查
/etc/httpd/conf.modules.d/00-base.conf是否已取消注释:LoadModule headers_module modules/mod_headers.so - 验证是否生效:
apache2ctl -M | grep headers(或httpd -M | grep headers),输出应含headers_module (shared)
在全局或虚拟主机中正确写 Header 指令
把 Header 放错位置是高频失败原因。不能写在 <directory></directory> 外层、不能只包在未启用的 <ifmodule mod_headers.c></ifmodule> 里,更不能漏掉 always 修饰符。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 推荐写法(放于
<virtualhost></virtualhost>块内,或主配置文件如httpd.conf的全局区域):Header always set X-Content-Type-Options "nosniff" - 禁用
Header set(不带always):它可能被 PHP 或反向代理覆盖;always强制注入最终响应 - 禁止使用
append或merge:该头只允许唯一存在,重复设置会失效
特别注意生效范围和验证方式
这个头只在浏览器解析 text/css、text/javascript、application/javascript 及部分二进制资源时强制生效;对 text/html 不触发防护逻辑——所以不能只看首页 HTML 是否返回了该头。
- 验证必须针对 JS/CSS 文件,例如:
curl -I http://localhost/script.js,确认响应头含X-Content-Type-Options: nosniff - 若用反向代理(如 ProxyPass 到 Node.js/Python),默认会丢弃原始响应头,需额外配置:
ProxyPreserveHost On+ 在<proxy></proxy>块中重设该头 - 多端口部署(如 XAMPP 中的 8080/8081)时,该头必须在所有端口监听配置中统一生效,不能只配在一个
<virtualhost></virtualhost>里
值必须拼写完全准确
浏览器只认严格小写的 nosniff,任何变体都会失效:
- ✅ 正确:
"nosniff" - ❌ 错误:
"no-sniff"、"NoSniff"、"nosniff "(尾部空格)、nosniff(无英文双引号)

















