nginx 通过精准控制 mime 类型映射实现“严格”效果:自定义 types 块替代默认 mime.types,显式设置 default_type 为 application/octet-stream,location 中显式引入 types 或内联声明,并通过 curl 验证响应头。

Nginx 本身不提供“严格的 MIME 类型检查”功能——它从不读取文件内容,只根据请求 URL 的末尾扩展名查表匹配 types 块中的映射。所谓“严格”,其实是通过精准控制映射 + 合理兜底 + 显式拒绝未定义类型来实现的等效效果。
要让静态资源的 MIME 类型行为更可控、更安全、更符合现代前端要求,关键不在“检查内容”,而在杜绝模糊匹配、防止意外降级、确保每个常用后缀都有明确归属。
以下四点是实际落地的核心做法:
-
只用自定义 types 块,不依赖默认 mime.types 的完整性
新建/etc/nginx/conf.d/custom.mime,在其中完整声明你项目真正用到的后缀:types { text/html html htm shtml; text/css css; application/javascript js mjs; application/json json api; font/woff2 woff2; image/avif avif; image/webp webp; image/svg+xml svg; application/wasm wasm; text/plain log txt; }然后在
http块中include它,并移除或注释掉include mime.types;——避免旧版默认文件漏配新格式(如.avif)、或引入你不想要的类型(如.exe→application/octet-stream)。 -
显式设置
default_type为安全值,且禁止隐式 fallback
在http块顶部或紧邻types块之后,写:default_type application/octet-stream;
这样,任何未在
types中声明的后缀(比如.br、.asset、.tsbuildinfo)都会返回Content-Type: application/octet-stream,浏览器强制下载,不会尝试解析或执行。这比留空或设为text/plain更安全,也更容易被发现配置遗漏。 -
在 location 块中避免 MIME 丢失,尤其正则匹配时
如果你用了类似location ~* \.(js|css|png)$的写法,Nginx 不会自动继承外层types。必须显式带入:location ~* \.(js|css|png|woff2|avif)$ { root /var/www/static; include /etc/nginx/conf.d/custom.mime; }或者直接内联:
location ~* \.js$ { root /var/www/static; types { application/javascript js; } }否则,该 location 下所有匹配请求都可能退回到
default_type,导致 JS 被当二进制下载。 -
验证必须落到具体响应头,不能只看配置是否加载
改完后执行:nginx -t && nginx -s reload
然后逐个测试关键资源:
curl -I https://yoursite.com/app.mjs # 应含 Content-Type: application/javascript curl -I https://yoursite.com/icon.avif # 应含 Content-Type: image/avif curl -I https://yoursite.com/unknown.xyz # 应含 Content-Type: application/octet-stream
若某项不满足,优先排查:拼写错误(如
woff2写成wof2)、include路径不存在、types块位置被其他指令覆盖、或该请求实际命中了没配types的location。
不复杂但容易忽略。











