default是map指令中唯一能兜底“无匹配”状态的必需配置项,显式声明可避免变量为空导致proxy_pass错误等异常;其位置任意但推荐置顶或置底,且不参与优先级竞争,仅在所有匹配失败后生效。

默认值是 map 指令中保障变量始终有可用值的关键机制。它不是可选项,而是强烈建议显式设置的配置项——不写 default 时,未匹配任何规则的变量会被赋为空字符串(""),这在多数实际场景中容易引发意料之外的行为,比如 proxy_pass 构造出非法 URL 或 if 判断逻辑失效。
default 必须显式声明才可靠
当源变量值未命中任何映射条目时,Nginx 不会自动 fallback 到某个隐含值。default 是唯一能覆盖“无匹配”状态的语法。例如:
-
map $host $backend { default "backend-default"; example.com "backend-a"; }→ 所有非example.com的请求都走backend-default -
map $host $backend { example.com "backend-a"; }→ 其他域名下$backend为空,若用于proxy_pass http://$backend;将导致 502 错误
default 的位置和优先级
default 行可以放在映射块中的任意位置,但推荐放在最上方或最下方,便于阅读。它的生效逻辑与其他规则正交:只有在所有精确匹配、通配符匹配、正则匹配全部失败后,才会启用 default。它不参与“优先级竞争”,只兜底。
空字符串与 default 的区别
未设 default 时的空字符串 "" 和显式写 default "" 在行为上等价,但语义不同:
- default "" 是主动声明“此处确实应为空”,具有可读性和可维护性;
- 完全省略 default 则属于隐式假设,一旦后续新增规则或变更源变量取值范围,容易遗漏兜底逻辑。
结合 hostnames 或正则时仍需 default
即使启用了 hostnames 参数支持通配符(如 *.example.com),或使用了多个 ~* 正则规则,都无法覆盖全部可能输入。用户可能发来畸形 Host 头、IP 直连、空 Host,或绕过 DNS 的自定义请求。这些情况仍需 default 收口,否则变量值不可控。











