nginx的location块不直接按mime类型匹配,而是基于uri路径匹配;但可通过types块自定义扩展名映射、map指令提取$sent_http_content_type实现差异化响应控制,并配合gzip_types、add_header等指令对特定mime类型施加压缩、缓存或安全策略。

Nginx 的 location 块本身不直接按 MIME 类型匹配或处理请求,它匹配的是 URI 路径(或路径前缀、正则表达式),而非响应内容的 MIME 类型。但你可以通过组合 location、types、add_header、default_type 和 map 等指令,实现“对不同 MIME 类型的响应施加差异化处理”,比如设置特定响应头、重定向、拒绝访问或启用压缩。
用 location 匹配资源路径,再靠 types 控制 MIME 映射
Nginx 默认根据文件扩展名决定响应的 Content-Type,该映射由 types 块定义(通常在 mime.types 中)。你可以在 location 内覆盖或补充这一行为:
- 在
location块中使用types { ... }自定义扩展名与 MIME 类型的对应关系 - 用
default_type强制指定该 location 下所有响应的默认 MIME 类型 - 例如,让所有
.js文件以application/javascript返回(而非旧版text/javascript):
types { application/javascript js; }
add_header X-Content-Type-Options "nosniff";
}
用 map 指令按 MIME 类型做条件判断
虽然 location 不支持按 MIME 类型匹配,但你可以用 map 将 $sent_http_content_type(已发送的 Content-Type)映射为变量,再在 if 或响应头中使用(注意:if 在 location 中受限,更适合用于 header 设置):
- 定义 map 将常见 MIME 类型转为标识符
- 在 server 或 location 中用
add_header或expires做差异化控制 - 示例:对图片和字体设置长缓存,对 HTML 设置短缓存
"~*image/" "public, max-age=31536000";
"~*font/" "public, max-age=31536000";
"~*text/html" "no-cache";
default "public, max-age=3600";
}
location / {
add_header Cache-Control $cache_control;
}
针对特定 MIME 类型限制或重写响应
当后端(如 PHP、FastCGI)返回特定 MIME 类型时,可在 Nginx 层拦截并干预:
- 用
proxy_hide_header或fastcgi_hide_header隐藏后端设置的危险头(如X-Powered-By) - 用
add_header统一添加安全头(如Content-Security-Policy),仅对 HTML 或 JS/CSS 生效 - 用
error_page+location = /403.html实现 MIME 类型触发的定制错误页(需配合后端返回状态码)
压缩与 MIME 类型强相关,需显式配置
gzip_types 和 gunzip 指令决定了哪些 MIME 类型会被压缩。它不依赖 location,但可放在 location 块内实现局部启用:
- 默认 gzip_types 包含 text/css、application/javascript 等,但不含 application/json、image/svg+xml
- 若需对 API 返回的 JSON 启用 gzip,需显式添加:
gzip_types application/json; - 注意:若 location 中禁用了 gzip(
gzip off),则内部gzip_types不生效











