核心是严格按声明类型处理资源,需启用mime.types映射、禁用mime嗅探(x-content-type-options: nosniff)、避免default_type误覆盖、隔离高危路径禁脚本执行。

核心是让浏览器严格按声明的类型处理资源,不猜测、不妥协。关键不在“加什么”,而在“禁什么”和“准什么”。
启用并验证 mime.types 映射
Nginx 自带的 mime.types 文件已定义主流静态资源类型,但必须显式加载才生效:
- 在
http块顶部确认存在:include /etc/nginx/mime.types;(路径可用find / -name mime.types 2>/dev/null查找) - 检查是否包含关键条目,如:
application/javascript js mjs;、text/css css;、font/woff woff woff2; - 修改后务必运行
nginx -t测试,再nginx -s reload生效
关闭浏览器 MIME 嗅探
即使服务器返回了正确类型,旧版或宽松浏览器仍可能根据文件内容“重判”类型——这正是脚本被误执行的温床:
- 在
http或server块中添加:add_header X-Content-Type-Options "nosniff" always; - 该头强制浏览器放弃内容分析,只信任
Content-Type声明值 - 对所有静态资源(尤其是
.js、.css、.svg、字体)都起效
避免 default_type 覆盖合法类型
default_type 是兜底机制,但用错会“一锅端”:
- 禁止在
http或server级别设为application/octet-stream或text/plain,否则.js也会被当二进制流丢弃 - 若需兜底,建议设为
application/octet-stream并仅用于明确不可信路径(如上传目录),而非全局 - 不要在
location块里写空types { }或覆盖include mime.types,会导致继承失效
隔离高危路径,禁用脚本执行
MIME 类型配置不能替代权限控制。上传目录、用户可写路径必须物理阻断执行能力:
- 对
/uploads/、/media/等路径,添加明确拒绝指令: location ^~ /uploads/ { location ~ \.(php|phtml|pl|py|jsp|asp|sh|cgi)$ { return 403; } }- 配合
add_header Content-Disposition "attachment";强制下载,进一步降低风险











