Nginx 的 map 指令本身不执行重定向,但可动态生成变量配合 rewrite 或 return 实现灵活重定向;它必须定义在 http 块中,用于从请求特征提取信息并映射,再在 server 或 location 中统一触发跳转。

Nginx 的 map 指令本身不执行重定向,但它能根据变量动态生成值,配合 rewrite 或 return 就可以实现灵活、可维护的复杂重定向逻辑。关键在于:用 map 提前计算目标 URL(或状态码),再在 server 或 location 块中统一触发跳转。
用 map 提取并映射请求特征
map 适合从请求头、URI、参数、域名等提取信息,生成新变量。它必须定义在 http 块中,且不能嵌套。常见用途包括:
- 根据 Host 或子域名映射到不同目标路径或域名
- 按 User-Agent 分流移动端/PC端重定向
- 解析 query string 参数(如
ref=abc)映射到对应落地页 - 匹配 URI 前缀或正则,生成重定向类型标识
示例:按子域名映射目标路径
http {
map $host $target_path {
~^blog\.example\.com$ /blog;
~^shop\.example\.com$ /store;
~^old\.example\.com$ /legacy;
default /;
}
}在 location 中用 rewrite 或 return 触发跳转
map 生成的变量(如 $target_path)可在 location 中直接使用。注意:不要在 map 里写 rewrite;重写动作必须放在 server 或 location 上下文中。
推荐优先用 return 301,性能更高、语义更清晰:
server {
listen 80;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;">location / {
# 若 host 匹配了 map 中的规则,且 target_path 不是默认值,则 301 跳转
if ($target_path != "/") {
return 301 https://new-site.com$target_path$request_uri;
}
# 其他请求走正常处理
proxy_pass http://backend;
}}
⚠️ 注意:if 在 location 中虽可用,但仅限简单判断(如变量比较)。避免在 if 中写 proxy_pass 或复杂的 rewrite 链。
结合正则与多条件映射(进阶用法)
一个 map 可以同时匹配多个输入源,通过嵌套 map 或组合变量实现“与”逻辑。例如:只对特定域名 + 特定 URI 前缀的请求重定向:
map $host:$uri $should_redirect {
~*^blog\.example\.com:/old-post/ 1;
~*^docs\.example\.com:/v1/.* 1;
default 0;
}
<p>map $should_redirect $redirect_to {
1 <a href="https://www.php.cn/link/4f6bb1a9bd9b099bdcca86d251711892">https://www.php.cn/link/4f6bb1a9bd9b099bdcca86d251711892</a>;
0 "";
}</p>然后在 location 中判断:
location / {
if ($redirect_to) {
return 302 $redirect_to;
}
# …
}这种写法把“条件判断”和“动作执行”分离,配置清晰、易于扩展,也方便日志记录(可记录 $should_redirect)。
避坑提醒:常见错误与优化建议
- map 不支持嵌套或动态计算:不能在 map 中调用另一个 map 变量,也不能用 $arg_xxx 直接参与正则匹配(需先用 map 提取再组合)
- 空格和引号要小心:map 的 value 如果含空格或特殊字符,必须用引号包裹,否则 Nginx 解析失败
-
避免滥用 if + rewrite:Nginx 官方明确不建议在 location 中用 if 做 URI 重写,应优先用
return或rewrite ... last/break配合命名 location -
调试技巧:用
add_header X-Redirect-Status "$should_redirect";临时加响应头,快速验证 map 是否生效
本质上,map 是 Nginx 的轻量级“规则引擎”,rewrite/return 才是“执行器”。两者分工明确,组合起来就能替代大部分外部重定向服务,且零依赖、高性能。











