nginx配置泛域名并不复杂,核心就在于server_name里写通配符.example.com,再配合DNS的泛解析记录,就能让任意子域名自动落到同一个虚拟主机或不同虚拟主机上。下面我把虚拟主机和泛解析的具体操作、匹配优先级、常用场景以及容易踩的坑一起说清楚。
先分清两个概念:泛解析和虚拟主机
泛解析(也叫泛域名解析)是在DNS层面做的事,你在域名解析控制台添加一条记录,指向服务器的IP地址,那么不管用户访问abc.example.com还是xyz.example.com,流量都会被送到同一台服务器,这条记录的生效时间通常在几分钟到几小时内,看你的DNS服务商,所谓“泛解析和泛绑定”,泛解析解决的是网络路由的问题,泛绑定解决的是nginx该如何响应这些请求。
虚拟主机(server块)才是nginx层面的概念,nginx收到请求后,根据Host字段来决定走哪个server块,你可以在同一台服务器上配置几十个server块,每个负责不同的域名或端口,nginx虚拟主机配置的核心就是server_name的匹配规则。
nginx泛域名解析怎么做
假设你的域名是example.com,想让所有子域名都走同一套配置,最简单的方式是这样:
server {
listen 80;
server_name .example.com example.com;
root /var/www/example;
index index.html;
}
注意server_name里同时写了.example.com和example.com,这样主域名和子域名都能命中,通配符nginx只支持一个,也就是只能匹配一级前缀,像.sub.example.com这样的是不支持的,需要单独写server块。
DNS泛解析配置步骤
在域名控制台添加一条A记录:
- 主机记录填
- 记录类型选A
- 记录值填你的服务器公网IP
- TTL默认即可
有些面板(比如宝塔)里还提供“泛解析”按钮,本质就是帮你填这条记录,配置完成后,用ping abc.example.com验证解析是否生效。
server_name的通配只匹配一层前缀
这点很多新手容易忽略。.example.com能匹配blog.example.com,但匹配不了a.b.example.com,后者需要另行配置一个带两层前缀的规则,如果你的业务涉及多级子域名,建议用默认server块做兜底。
nginx虚拟主机配置与泛绑定场景
虚拟主机的概念就是“一个nginx服务承载多个站点”,泛绑定则是指通过通配符把这些站点组合在一起,具体怎么选,取决于你的业务需求。
泛解析指向同一个服务
适合SaaS平台、多租户系统、用户个人主页这类场景,所有子域名共享一份代码,但根据子域名前缀动态生成不同内容,例如user123.example.com展示用户123的页面,代码里通过解析Host来识别。
配置仍然是最简单的通配server块:
server {
listen 80;
server_name .example.com;
...
}
然后在后端(PHP、Python、Node等)里获取HTTP请求的Host字段做分发,PHP里用$_SERVER['HTTP_HOST']取出完整域名,再去掉主域后缀,就得到了子域名的前缀,逻辑上类似这样:
$host = $_SERVER['HTTP_HOST']; // user123.example.com
$prefix = str_replace('.example.com', '', $host); // user123
之后你想查数据库也好、读缓存也好,都是基于这个前缀来做,这套方案在nginx多站点配置里很常见,好处是新增子域名用户时,无需改动nginx,也无需重启服务。
泛解析到不同虚拟主机
另一种用法是,虽然DNS泛解析把流量都送到了服务器,但nginx根据不同的子域名前缀路由到不同的目录或不同端口。
思路是用正则匹配server_name:
server {
listen 80;
server_name ~^(?<sub>[a-z0-9]+).example.com$;
root /var/www/$sub;
}
请求dev.example.com时,root自动变成/var/www/dev;请求blog.example.com时,root变成/var/www/blog,目录不存在则返回404,这种方案的优点是子域名和站点一一对应,适合明确知道有哪些子域名的场景。
nginx的server_name匹配规则有三个优先级,按顺序为:
- 精确匹配(如
blog.example.com) - 通配符匹配(如
.example.com) - 正则匹配(如
~^(?<sub>...))
当多个server块同时命中同一个请求时,nginx永远先走精确匹配,其次是通配符,最后才用正则,这个顺序直接影响你配置虚拟主机时的布局,所以记得把精确域名的server块单独拎出来。
让多个子域名指向同一套配置的两种写法
有几种写法可以达到类似效果,假设你要让a.example.com和b.example.com都指向同一个站点:
写法一,写在同一个server_name里:
server_name a.example.com b.example.com;
写法二,用正则简化表达:
server_name ~^(a|b).example.com$;
如果你的子域名数量在变化、且你希望自动覆盖所有未列出的子域名,就是用.example.com做主配置,再加一个精确的server块处理主域名,如果子域名就固定两三个,那就别用通配,直接列出来更清晰、更安全。
泛域名配置中的常见问题
nginx泛解析导致主域名访问异常
不少人配置.example.com后发现example.com打不开,原因是通配符不匹配不带任何前缀的裸域名,所以你得把裸域名也一起写进server_name:
server_name example.com .example.com;
HTTPS证书和泛解析的冲突
通配符域名的证书就是.example.com,一张证书能覆盖主域名和所有一级子域名,但要注意,它覆盖不了二级子域名如a.b.example.com,申请泛域名证书时,多数CA机构(如Let’s Encrypt、DigiCert)要求验证域名所有权,流程跟普通证书不太一样,需要配置DNS TXT记录验证,如果你的子域名服务是动态新增的,建议在申请通配符证书时一并配置自动DNS验证,减少人工介入,泛解析后所有子域名都暴露了同一个IP,如果某个子域名涉及违规内容,整台服务器的风险会上升,这一点在服务器选址和备案规划时提前想好。
手机网站与泛解析的联合使用
常见的做法是做一个m.example.com的独立手机站,DNS泛解析已经让所有子域名都能访问到服务器,但nginx里可以给m.example.com单独配置一个server块,指定不同的root和入口文件,比如手机站走简洁模板、桌面站走完整功能,这种情况下,.example.com是兜底,精确的m.example.com优先级更高,请求会先命中手机站配置。
性能与安全层面的建议
泛解析本身几乎不影响nginx性能,因为server_name的匹配是在启动时编译成哈希表的,查找速度很快,但泛解析会带来一个隐患:恶意请求利用不存在的子域名对你的服务器发起海量访问,由于DNS已经返回了真实IP,流量会直接打到nginx上,行业共识认为,处理这类问题的常见手段是:
- 在server块里加上限流配置(
limit_req_zone) - 对不存在的子域名返回404或410
- 配合WAF拦截异常Host头
由于泛解析绑定了所有子域名,检索引擎会同时收录大量子域名页面,如果某一批子域名页面内容为空或者高度重复,可能被判定为低质量页面,在nginx里为泛解析配置统一的robots规则,或者在应用层对无内容的子域名返回状态码,都是值得做的细节。
宝塔面板里怎么配泛解析
用宝塔的站长不在少数,操作路径也简单:
- 在“网站”里添加站点,域名填
.example.com,同时把example.com加进去 - 自动生成站点目录和配置文件
- 在DNS解析控制台添加的A记录,指向服务器IP
- 如果需要HTTPS,在宝塔的SSL证书里申请通配符证书,按提示配置DNS验证
宝塔的应用层逻辑一般已经处理好server块,你不需要手动编辑conf文件,但宝塔默认生成的配置里可能会有server_name的重复项,多个站点域名设置交叉时优先匹配顺序容易乱,建议同一台机器上的站点域名不要相互包含,就nginx泛域名解析这一块,动手实践一次基本就能掌握。
其实nginx配置通配域名的关键就三步:DNS加一条解析记录,server_name里写.example.com,后端按需解析子域名前缀,虚拟主机和泛解析配合得好,可以大幅减少配置维护量;配合不好,也容易引入域名匹配混乱和安全隐患,多花十分钟验证自己的匹配优先级,后面省下的时间远超这些。
泛域名解析配置中,server_name不生效是什么原因
最常见的原因有三个,第一,你只配了.example.com,但你访问的是example.com,裸域名不匹配,需手动补充,第二,nginx没有重新加载配置文件,配置完server块后要执行nginx -t检查语法,再systemctl reload nginx让配置生效,第三,配置里存在另一个更精确匹配的server块,把请求抢走了,用nginx -T可以查看当前生效的所有server配置,仔细核对每个server_name的覆盖范围。
nginx虚拟主机配置里,正则和通配符同时存在时谁优先
nginx虚拟主机的匹配顺序是精确匹配优先,然后通配符匹配,最后正则匹配,这意味着即使正则写在前面,通配符的server块也能优先生效,如果你的需求必须让某个正则规则优先,应该避免用通配符覆盖那个域名,改用精确域名配合正则来划分优先级。
配置了nginx泛解析之后,如何限制某些子域名不允许访问
在nginx server块里写一个精准匹配的拒绝策略即可,在.example.com的server块上一个虚拟主机配置泛解析,同时新增一个精确的forbidden.example.com的server块,内部返回403或444,利用精确匹配优先级的机制,将该特定子域名请求拦截下来,其它子域名不受影响。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/643528.html





