nginx 通过 map 指令在 http 块中预定义语义化变量,基于请求特征(host、uri、header、参数等)在 server 阶段前完成映射,支持正则捕获、跨 server 复用、与 proxy_pass/limit_req/if 等指令联动,实现解耦、动态、可维护的转发与控制逻辑。

Nginx 本身不提供“编程式”变量赋值能力,但通过 map 指令可构建语义清晰、可复用的自定义变量,成为实现复杂转发逻辑的核心支点。它不是临时计算值,而是基于请求特征(如 Host、URI、Header、参数)在请求进入 server 阶段前就完成映射,天然适配 rewrite、proxy_pass、limit_req、if 判断等关键场景。
用 map 定义跨站点通用业务标识
map 必须写在 http{} 块内,所有 server 均可引用,适合抽象出与具体站点解耦的业务维度:
- 比如按请求路径类型打标:
map $request_uri $route_type { ~^/api/v1/export/.* export; ~^/api/v1/report/.* report; default api; } - 再如识别灰度用户:
map $http_x_user_id $is_gray { ~^[a-z]{2}123\d{4}$ 1; default 0; }(匹配特定 ID 格式) - 注意:规则从上到下匹配,首个命中即止;未匹配且无
default时变量为空字符串
在 location 中组合变量驱动转发行为
有了 map 变量,就能在具体 location 块中做条件决策,避免硬编码和重复判断:
- 根据 route_type 分流到不同后端:
proxy_pass http://$route_type_backend;,配合另一组 map 定义$route_type_backend映射到 upstream 名称 - 对高风险路径加访问控制:
if ($route_type = "export") { limit_req zone=export_limit burst=3 nodelay; } - 用变量控制重定向目标:
rewrite ^/jump$ $redirect_target break;,其中$redirect_target由 map 基于$arg_mode动态生成
结合 header 和 cookie 构建身份感知路由
真实业务常需识别用户等级、设备类型或会话状态,这时要善用 $http_* 和 $cookie_* 等内置变量作为 map 输入源:
- 读取自定义 header(如
X-User-Rank):map $http_x_user_rank $backend_weight { premium 10; basic 3; guest 1; default 1; } - 解析 cookie 中的登录态:
map $cookie_sessionid $is_logged_in { "~^[a-f0-9]{32}$" 1; default 0; } - 重要提醒:若 header 含下划线(如
X_WX_UNIONID),需先在 http 块启用underscores_in_headers on;,否则 Nginx 默认忽略
进阶:用正则捕获 + 变量拼接实现动态后端寻址
map 支持正则捕获组,能从 URI 或 Host 中提取结构化信息,用于生成精确的后端标识:
- 示例:根据子域名和 API 版本选择集群:
map $host:$request_uri $upstream_cluster { ~*^v2\.api\.example\.com:/v2/(admin|user)/.* v2-$1; ~*^staging\.example\.com:/.* staging-all; default default-cluster; } - 右侧可直接引用
$1、$2等捕获内容,实现“一配置多用途” - 拼接输入(如
$host:$arg_version)可扩大匹配维度,但要注意长度可控,避免内存膨胀











