通过正则命名捕获子域名并动态拼接 root 路径,可实现 a.example.com 自动指向 /var/www/a、b.example.com 指向 /var/www/b;关键在于 server_name 使用 ~^(?<subdomain>1+).example.com$ 捕获子域名存入 $subdomain 变量,并在 root 指令中引用 /var/www/$subdomain,配合 DNS 泛解析和权限配置即可生效。. ↩

直接用正则捕获子域名,再动态拼接 root 路径,就能让 a.example.com 自动指向 /var/www/a,b.example.com 指向 /var/www/b —— 不用每加一个子域就改一次配置。
server_name 必须用正则匹配并命名捕获
通配符 *.example.com 只能匹配,不能提取子域名;真正实现“自动”的关键是命名捕获组。写法如下:
server_name ~^(?<subdomain>[^.]+)\.example\.com$;</subdomain>-
(?<subdomain>[^.]+)</subdomain>表示捕获第一个点前、不含点的所有字符(即二级域名本身),存入变量$subdomain - 注意转义点号:
\.,否则.会匹配任意字符 - 这个正则不匹配
example.com(主域)或a.b.example.com(三级域),符合常规预期
root 路径要动态引用 $subdomain 变量
把 $subdomain 直接用在 root 指令里,Nginx 会在每次请求时实时计算路径:
root /var/www/$subdomain;- 确保目录存在且 Nginx 有读取权限,比如
/var/www/a/下要有index.html或其他入口文件 - 如果想统一 fallback 到某个默认目录(如
/var/www/default),可加try_files或用error_page 404处理
DNS 和部署细节不能漏
配置生效的前提是请求真能到达这台 Nginx:
- DNS 必须添加
*泛解析记录:将*.example.com的 A 记录指向 Nginx 服务器 IP - 确认
nginx -t配置校验通过,再nginx -s reload生效 - 若用 HTTPS,需额外配置
resolver(用于 upstream 域名解析)、proxy_ssl_server_name on(转发 SNI),但纯静态目录服务通常不需要 proxy_pass - 匹配优先级:Nginx 先匹配精确域名(如
www.example.com),再匹配通配符,最后才轮到正则;所以泛解析的 server 块建议放在具体域名配置之后,避免被覆盖
常见问题处理提示
遇到 403 或 404 时,优先检查这几处:
-
ls -ld /var/www/$subdomain—— 确认目录存在、权限为nginx:nginx或可读 -
curl -H "Host: a.example.com" http://127.0.0.1—— 本地绕过 DNS 测试是否匹配成功 - 浏览器访问时,F12 查看 Network → Response Headers,确认返回的是你期望的目录下的内容,不是默认欢迎页
- 日志里出现
directory index of "/var/www/a/" is forbidden?说明没配index指令或目录下无默认文件,补上index index.html index.php;


















