核心是用正则server_name ~^(?<subdomain>[^.]+)\.example\.com$捕获子域名存入$subdomain变量,并在root /var/www/$subdomain;中动态引用,配合DNS泛解析(*.example.com → IP)及配置位置置于精确匹配之后,即可实现a.example.com自动指向/var/www/a。

要让 Nginx 的 server 块实现泛域名解析并自动映射到同名项目目录(比如 a.example.com → /var/www/a),核心不是靠通配符 *.example.com,而是用正则捕获子域名 + 动态 root 路径。通配符只能“匹配”,不能“提取”;真正“自动”的关键在命名捕获和变量引用。
必须先做 DNS 泛解析
这是前提,Nginx 本身不查 DNS:
在你的域名管理后台(如阿里云、Cloudflare)添加一条 A 记录:
- 主机名填 *
- 记录值填你服务器的公网 IP
这样 shop.example.com、api.example.com 等所有二级域名请求才会发到这台 Nginx。
用正则捕获子域名并动态设 root
在 http 块里加一个 server 块,注意写法细节:
- 使用
~^开头的正则,带命名捕获组:server_name ~^(?<subdomain>[^.]+)\.example\.com$;</subdomain> -
[^.]+表示只取第一个点前的字符(排除三级域名如a.b.example.com),且避免点号被误匹配 -
\.必须转义,否则.是正则通配符 - 然后在
root指令中直接引用:root /var/www/$subdomain; - 确保每个子域名对应目录存在,且 Nginx 进程有读取权限(例如
/var/www/shop/下要有index.html)
注意匹配优先级和配置位置
Nginx 匹配顺序是:精确匹配 → 通配符 → 正则。所以这个泛解析 server 块要放在所有具体域名(如 www.example.com、app.example.com)配置的后面,否则会被更高优先级的块截走请求。
HTTPS 场景要额外处理证书
如果走 HTTPS:
- SSL 证书必须支持泛域名,即含 *.example.com SAN 条目
- 若还需响应根域名 example.com,证书得同时包含 example.com 和 *.example.com
- Nginx 配置中需配好 ssl_certificate 和 ssl_certificate_key,监听 443 ssl


















