Nginx 的 map 指令在 http 块中定义,根据源变量(如 $host、$arg_version)精确或正则匹配生成目标变量(如 $backend),支持 default 回退,惰性求值且性能高效。

在 Nginx 中,map 指令用于根据某个变量的值,动态生成另一个变量,常用于请求分流、灰度发布、地域路由、协议适配等场景。它不是运行时计算,而是在配置加载阶段构建查找表,性能高效且声明式清晰。
map 的基本语法和作用域
map 必须定义在 http 块中,不能写在 server 或 location 内。它的核心是“输入变量 → 输出值”的映射关系,支持精确匹配、正则匹配和默认值 fallback。
- 第一个参数是源变量(如
$host、$arg_version、$http_user_agent) - 第二个参数是目标变量名(必须以
$开头,如$backend) - 花括号内是键值对:键可以是字符串、正则(以
~或~*开头)、通配符*;值可以是字符串、空字符串或另一个变量 - 可选
default指定未匹配时的默认值;不设则为 empty string
常见实用示例
按域名选择后端服务
用 $host 区分不同业务入口:
map $host $backend {
default "127.0.0.1:8001";
api.example.com "127.0.0.1:8002";
admin.example.com "127.0.0.1:8003";
}然后在 location 中引用:proxy_pass http://$backend;
按 URL 参数控制缓存策略
识别灰度标识,动态设置缓存时间:
map $arg_beta $cache_ttl {
"1" "10s";
default "1h";
}配合 expires $cache_ttl; 或 proxy_cache_valid 使用。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
按 User-Agent 分流到不同版本池
区分移动端与桌面端,或新旧客户端:
map $http_user_agent $upstream_group {
~*android|ios "mobile_backend";
~*msie|trident "legacy_backend";
default "main_backend";
}再结合 upstream 块实现真实转发。
注意事项与避坑点
map 是惰性求值的——只有当目标变量被实际使用时,Nginx 才会执行匹配逻辑,因此不会造成额外开销。
- 键不支持变量插值(比如不能写
"$arg_v-$arg_t"),只支持字面量或正则 - 正则匹配优先级高于字符串匹配,但 Nginx 会按书写顺序从上到下扫描,遇到第一个匹配即停止
- 空格敏感:键和值之间至少一个空格,值前后空格会被保留(建议用引号包裹含空格的值)
- 若映射结果需参与复杂判断(如嵌套条件),建议仍用
if+set,但注意if在 location 中有局限性
验证与调试技巧
启用 log_format 记录映射结果,便于排查:
log_format debug_map '$remote_addr - $host → $backend ($arg_beta → $cache_ttl)'; access_log /var/log/nginx/debug.log debug_map;
修改配置后务必 nginx -t 测试语法,再 nginx -s reload 生效。可通过 curl -H "Host: api.example.com" http://localhost/ 配合日志确认映射是否生效。

















