nginx ≥ 1.11.2 支持 server_name 中使用命名捕获组(如(?[a-z]+)-(?[a-z]+).example.com),提取的变量$module、$env为请求级变量,可用于set、if、proxy_pass等指令,但不可用于upstream或map顶层。

Nginx 支持在 server_name 指令中使用正则表达式,配合命名捕获组(named capture groups),可以灵活提取域名中的关键部分(如子域、项目名、环境标识等),并用于后续配置,比如设置变量、重定向或动态代理。
启用命名捕获组的语法要求
Nginx 从 0.8.25 版本起支持正则表达式匹配 server_name,但命名捕获组((?<name>...)</name>)需 Nginx ≥ 1.11.2(因依赖 PCRE 8.12+)。确保你的 Nginx 版本满足条件:
$ nginx -v
若版本过低,命名捕获组会直接报错(如 invalid server_name directive)。
在 server_name 中定义命名捕获组
在 server 块中,用波浪线 ~ 开头表示区分大小写的正则匹配(~* 表示不区分大小写),并在括号内使用 (?<name>...)</name> 语法定义捕获组:
例如,匹配形如 api-staging.example.com 或 admin-prod.example.com 的域名,并提取环境(staging/prod)和模块(api/admin):
server {<br> server_name ~^(?<module>[a-z]+)-(?<env>[a-z]+)\.example\.com$;<br> # 后续可引用 $module 和 $env 变量<br> set $backend_port 8080;<br> if ($env = "prod") { set $backend_port 9000; }<br> location / { proxy_pass http://127.0.0.1:$backend_port; }<br>}</env></module>注意:
• ^ 和 $ 推荐显式写出,避免意外匹配(如防止 xx-api-staging.example.com 被误捕获);
• 点号 . 必须转义为 \.;
• 命名组名只能含字母、数字、下划线,且不能以数字开头。
捕获组变量的作用范围与使用限制
命名捕获组生成的变量(如 $module、$env)是**请求级变量**,仅在当前 server 块的上下文中有效,可用于:
• set、if、rewrite、proxy_set_header 等指令;
• 日志 log_format 中(需确保日志格式定义在捕获发生之后);
• return 或 error_page 的重定向 URL。
但不可用于:
• upstream 块中(变量尚未解析);
• map 块顶层(需用 map + $host 或 $server_name 间接实现);
• 其他 server 块(作用域隔离)。
调试与验证技巧
命名捕获是否生效,可通过以下方式确认:
• 在 location 中临时返回变量值:return 200 "module=$module, env=$env\n";;
• 使用 nginx -t 检查语法(命名错误会直接报错);
• 查看 error log:若正则编译失败(如 PCRE 版本不足),会记录类似 PCRE library does not support (?<name>)</name> 的提示;
• 避免过度复杂正则:Nginx 正则在每次请求时执行,高并发下应保持简洁(推荐最多 2–3 个命名组)。











