一个 server 块配合命名捕获正则 ~^(?[a-z0-9_-]+)\.example\.com$ 可自动处理合法二级域名,提取子域存入 $subdomain 变量,用于 root、proxy_pass 等动态配置,并需 dns 泛解析、合理配置顺序及 default_server 防护。

用一个 server 块配合正则表达式,就能让 a.example.com、blog.example.com 等所有合法二级域名自动生效,不用每加一个就改一次配置。
server_name 必须用命名捕获正则
通配符 *.example.com 只能匹配,不能提取子域名;真正实现“自动”的关键是把子域名存成变量。写法如下:
server_name ~^(?<subdomain>[a-z0-9_-]+)\.example\.com$;</subdomain>-
(?<subdomain>...)</subdomain>是命名捕获组,提取的值存在$subdomain变量里 -
[a-z0-9_-]+限制只接受小写字母、数字、下划线和短横线,更安全 -
\.中的反斜杠不能少,否则点号会匹配任意字符 - 这个正则不会匹配
example.com(主域)或a.b.example.com(三级域)
root 或 proxy_pass 动态引用变量
拿到 $subdomain 后,就可以灵活用于路径或转发目标:
- 静态站点:
root /var/www/$subdomain;→ 请求api.example.com就读取/var/www/api/ - PHP 应用:
fastcgi_param SCRIPT_FILENAME /var/www/$subdomain$fastcgi_script_name; - 反向代理:
proxy_pass http://backend-$subdomain;(需配合resolver和proxy_ssl_server_name on) - 加个防护:
if ($subdomain = "") { return 404; }避免空子域被误匹配
DNS 和配置顺序不能错
光有 Nginx 配置不够,还得确保请求真能到达并被正确分发:
- DNS 必须添加泛解析 A 记录:
*.example.com → 服务器公网 IP - 在 Nginx 配置中,把这个泛解析的 server 块放在具体域名(如
www.example.com)之后——Nginx 匹配优先级是:精确域名 > 通配符 > 正则,放错位置会导致social.example.com被泛规则吃掉 - 加上
default_server拦截未匹配的 Host 头,防止恶意绑定或信息泄露 - 改完执行
nginx -t校验,再nginx -s reload生效
可选:过滤敏感子域名
不想让某些子域(如 admin、dev、www)走泛规则?有两种方式:
- 用负向先行断言:
~^((?!(www|admin|dev|staging)).+)\.example\.com$ - 更推荐白名单优先:先写几个明确的
server_name admin.example.com www.example.com块,最后再放泛解析块作为 fallback - 搭配
try_files $uri /index.html =404;或error_page 404 /404.html;提升体验











