Nginx 通过 http 块内的 map 指令实现动态“全局变量”,基于内置变量运行时推导,用于跨站点策略控制;必须定义在 http 块中,推荐独立 .map 文件引入,命名需语义明确且设安全 default 值,修改后须重载生效。

Nginx 的 http 块本身不支持直接“定义全局变量”,但可通过 map 指令在 http 上下文中创建可复用的、基于请求上下文计算出的变量——这才是实际可用的“全局变量”机制。这些变量不是静态值,而是运行时根据 $host、$args、$uri 等内置变量动态推导出来的逻辑标识,适用于跨站点统一控制策略(如白名单、路由分发、权限判断等)。
一、必须在 http 块内定义 map 变量
map 是唯一被 Nginx 官方支持的变量定义方式,且只能出现在 http { } 块中,不能写在 server 或 location 里。它本质是键值映射表,性能高效,无副作用。
常见合理用法包括:
- 根据域名区分可信来源
- 根据 URL 参数决定重定向目标
- 根据请求路径前缀标记环境类型(dev/staging/prod)
- 结合
$http_user_agent过滤爬虫或旧客户端
示例:按 Host 判断是否为内部管理域名
map $host $is_admin_domain {
default 0;
admin.example.com 1;
ops.example.net 1;
}二、避免直接修改 nginx.conf 导致升级覆盖
宝塔面板默认不开放 nginx.conf 编辑入口,手动改易被后续更新重置。更稳妥的做法是:
- 在
/www/server/nginx/conf/下新建独立.map文件(如global_rules.map) - 写入所有
map块,每段以分号结尾,缩进清晰 - 在
nginx.conf的http { }区域中include mime.types;后、include www.conf;前加入:include /www/server/nginx/conf/global_rules.map;
这样既保持结构清晰,又防止面板升级时丢失配置。
三、变量命名要有明确语义和作用域
不要用模糊名如 $var1、$tmp,而应体现用途与范围,例如:
-
$env_type→ 表示当前请求所属环境(dev/test/prod) -
$auth_level→ 表示用户认证等级(guest/user/admin) -
$route_mode→ 表示路由模式(legacy/api/v2)
同时注意:
-
map中default值应设为安全兜底项(如0、"deny"、"/404.html") - 键匹配区分大小写,域名通常全小写处理
- 若需正则匹配,请用
~开头(如~^api\..*),但会略微影响性能
四、定义后需重载配置才能生效
保存 .map 文件或 nginx.conf 后,必须执行:
- 宝塔面板:【软件商店】→【Nginx】→【设置】→【重载配置】
- 或命令行:
nginx -t && nginx -s reload
仅重启 Nginx 不够,map 属于编译期加载逻辑,必须重载(reload)而非 restart。
不复杂但容易忽略


















