Nginx通过后缀名查mime.types映射表决定Content-Type,推荐用include引入自定义types块并设default_type防未识别后缀;需nginx -t校验、reload生效,并用curl或DevTools验证响应头。

Nginx 本身不分析文件内容,只靠请求 URL 的后缀名(如 .js、.woff2)查表决定返回哪个 Content-Type 响应头。这个“查表”动作依赖的就是 MIME 类型映射机制,核心载体就是 mime.types 文件及其等效配置方式。
用 mime.types 文件管理静态资源类型的关键逻辑
它本质是一张静态映射表:后缀 → MIME 类型。Nginx 启动时加载所有 types 块(包括 mime.types 和你自定义的),合并成一张哈希表,后续每个静态请求都只做一次后缀字符串匹配。
比如访问 /main.css,Nginx 提取 css,查到 text/css,就在响应头中写入:Content-Type: text/css
浏览器据此决定是解析为样式表还是下载为纯文本。
推荐做法:不改原文件,用 include + 自定义 types 块
系统自带的 /etc/nginx/mime.types 易被升级覆盖,也不利于协作追踪。正确路径是:
- 新建自定义文件,例如
/etc/nginx/conf.d/custom.mime - 在
nginx.conf的http块中,放在default_type之后、include mime.types;之前或之后均可,但建议放后面,确保你的规则能覆盖默认值 - 写入:
include /etc/nginx/conf.d/custom.mime; - 在
custom.mime中写:types { application/javascript js mjs; font/woff2 woff2; image/avif avif; application/json json; text/css css; }
必须配 default_type 防止未识别后缀出问题
如果请求的是 .br(Brotli 压缩文件)、.webp(旧版 Nginx 默认没配)或自定义构建产物(如 .asset),而所有 types 块都没声明,Nginx 就不会发 Content-Type 头——这会导致浏览器行为不可控。
所以应在 http 或 server 块中显式设置:default_type application/octet-stream;
这样未匹配的文件会被当作二进制流强制下载,安全且可预期。若想更友好(如让 .log 当文本打开),可用 text/plain,但要确认资源确实是纯文本。
验证是否真正生效
改完不能只 reload,得逐层确认:
- 运行
nginx -t检查语法(尤其括号、分号、无点后缀) - 执行
nginx -s reload或systemctl reload nginx - 用
curl -I https://yoursite.com/test.woff2查响应头,确认Content-Type: font/woff2出现 - 浏览器打开 DevTools → Network → 看对应资源的 Header,同时留意 Console 是否还有 “MIME type mismatch” 类警告
注意:若在 location 块里用了正则(如 location ~* \.(js|css)$),又没在该块内重新定义 types,默认映射可能不继承,导致 .js 返回 application/octet-stream ——这是常见疏漏。


















