nginx 通过正则捕获子域名(如 server_name ~^(?[a-z0-9-]+)\.example\.com$)并用 $subdomain 动态设置 root /home/wwwroot/example.com/$subdomain/,配合 dns 泛解析和 default_server 回退机制实现泛域名映射。

要让 Nginx 的 server_name 支持泛解析并映射到动态目录,核心是用正则捕获子域名,再把捕获值作为路径变量注入 root 指令。Nginx 本身不支持通配符直接用于 root,但可通过命名捕获 + 变量引用实现。
必须用正则匹配,不能只靠 * 通配符
Nginx 的 server_name *.example.com 只能做路由分发,无法提取子域名;要动态绑定目录,必须使用 ~^ 开头的正则语法,并定义命名捕获组:
-
server_name ~^(?<subdomain>.+)\.example\.com$;</subdomain>—— 捕获子域名到变量$subdomain - 注意转义点号:
\.,否则.会被当作任意字符匹配 - 避免捕获空或非法值,可加限制如
[a-z0-9-]+替代.+
root 路径要引用捕获变量
将 $subdomain 直接用于 root,目录结构需提前规划好:
root /home/wwwroot/example.com/$subdomain/;- 例如访问
bbs.example.com→ 自动指向/home/wwwroot/example.com/bbs/ - 确保对应目录存在且 Nginx 有读取权限,否则返回 403 或 404
DNS 和基础要求不能漏
泛解析生效的前提不是 Nginx 单方面配置,还需外部配合:
- DNS 必须为
*.example.com设置 A 记录(或 AAAA),指向这台 Nginx 服务器 IP - HTTP 请求 Host 头必须是真实二级域名(如
bbs.example.com),浏览器或 curl 都会自动带 - 如果用 HTTPS,需额外配置
resolver、proxy_ssl_server_name on(仅反向代理场景)
推荐加一个 fallback server 防意外
未匹配的请求(比如错拼域名、直接 IP 访问)应导向默认页面或返回提示:
- 在对应端口的
listen行加上default_server - 例如:
listen 80 default_server;,搭配简单root和return 404或静态提示页 - 避免因缺失
default_server导致流量落到第一个 server 块,造成误响应











