Nginx二级域名泛解析需DNS泛解析、正则捕获子域名及动态root路径三者配合:DNS设*记录指向服务器IP;Nginx用~^(?1+).example.com$捕获子域名并root /var/www/$subdomain;需手动建目录、设权限、防空子域,且正则server块须置于精确匹配之后。. ↩

Nginx 实现二级域名自动泛解析,核心是DNS 泛解析 + Nginx 正则捕获 + 动态 root 路径三者配合。不是简单写个 server_name *.example.com 就能自动映射到同名目录——通配符只负责匹配,不负责提取子域名;真正“自动”的关键,在于用正则命名捕获并动态拼接路径。
以下是在 nginx.conf(或站点配置文件,如 /etc/nginx/conf.d/example.conf)中可直接使用的标准配置方式:
1. DNS 先做泛解析
在域名服务商(如阿里云、腾讯云)添加一条 A 记录: - 主机记录:`*` - 记录值:你的服务器公网 IP 这样 `a.example.com`、`blog.example.com`、`shop.example.com` 等所有二级域名都会指向这台 Nginx。2. Nginx 配置支持正则捕获子域名
在 `http { ... }` 块内添加一个 `server` 块,注意必须使用 `~^` 开头的正则表达式,并定义命名捕获组:server {
listen 80;
server_name ~^(?<subdomain>[^.]+)\.example\.com$;
# 确保子域名不为空,且不是主域(如 example.com)或三级域(如 a.b.example.com)
if ($subdomain = "") {
return 404;
}
root /var/www/$subdomain;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
# PHP 支持(如需)
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}说明要点:
-
~^(?<subdomain>[^.]+)\.example\.com$</subdomain>中:
(?<subdomain>[^.]+)</subdomain>捕获第一个点前的所有非点字符(即a、blog),存入变量$subdomain;
\.是转义点号,避免误匹配任意字符;
$保证结尾严格,排除a.b.example.com类三级域名。 -
root /var/www/$subdomain;是动态路径的核心,Nginx 每次请求时实时解析,比如访问blog.example.com→ 自动指向/var/www/blog/。 -
if ($subdomain = "") { return 404; }防止空子域名(如example.com)误入此块。
3. 权限与目录准备不能跳过
- 手动创建对应目录,例如: `sudo mkdir -p /var/www/blog /var/www/api` - 设置属主和权限(以 Debian/Ubuntu 的 `www-data` 或 CentOS 的 `nginx` 用户为准): `sudo chown -R www-data:www-data /var/www/blog` `sudo chmod -R 755 /var/www/blog` - 每个目录下至少放一个 `index.html`,否则会返回 403 或 404。4. 配置顺序与优先级要留意
Nginx 匹配 `server_name` 的顺序是: - 精确匹配(如 `server_name www.example.com;`)→ 最高优先 - 通配符前缀(如 `*.example.com`)→ 次之 - 正则匹配(如 `~^...`)→ 最后所以,把泛解析的 server 块放在具体域名配置之后,避免它抢走 www、api、admin 等已明确配置的域名。
验证与生效:
- 运行
sudo nginx -t检查语法 - 执行
sudo nginx -s reload重载配置 - 用
curl -H "Host: blog.example.com" http://你的IP测试(绕过 DNS)
不复杂但容易忽略。


















