当前位置:首页 > 知识

域名泛解析自动生成二级域名

泛解析加通配符证书,域名域名再套一层动态生成逻辑,泛解就能让任意二级域名指向同一个服务。析自这套玩法在SaaS建站、动生多租户系统里已经跑了好几年,成级但很多人第一次接触时还是域名域名会愣一下:域名还能这么用?

所谓泛解析,就是泛解在DNS里配一条 *.example.com 的A记录。这条记录一挂,析自abc.example.com、动生xyz.example.com、成级甚至a.b.c.example.com 全都会解析到同一个IP。域名域名你不需要为每个二级域名单独加记录,泛解省事,析自也省得等DNS生效。动生我最早注意到这个机制是成级在给一个客户做小程序后台,他们要求每个商户有自己的访问入口,比如 shop123.example.com。如果手动加解析,几千个商户根本管不过来。泛解析一开,世界安静了。

但光有泛解析还不够。浏览器地址栏里输入的二级域名五花八门,服务器怎么知道用户到底想访问哪个商户?这就轮到Nginx或者应用层来干活了。Nginx配置里写 server_name ~^(?<subdomain>.+)\\.example\\.com$;,把子域名抓出来,然后传给后端。后端拿到 shop123 这个字符串,去数据库里查对应的站点配置,返回不同的页面内容。整个过程对用户来说是无感的,他以为自己访问了一个独立站点,其实背后是同一套代码在跑。

证书是个绕不开的坎。泛解析域名得配泛域名证书,也就是 *.example.com 这种。普通单域名证书只认 www.example.com,换成 abc.example.com 浏览器立刻报红。Let's Encrypt 从2018年开始支持通配符证书,但申请时必须用DNS-01验证,得在DNS里加一条TXT记录。自动化脚本可以搞定,certbot配合DNS插件能续期,但第一次配的时候容易卡在权限上。我见过有人图省事直接用自签证书,结果每个访客都要点“继续访问”,体验直接崩掉。

动态生成这块,不同技术栈做法不一样。Node.js里用 req.headers.host 取域名,Python Flask用 request.host,PHP直接读 $_SERVER['HTTP_HOST']。拿到之后按点号切分,取第一段就是子域名。有些系统会做更复杂的映射,比如把子域名当租户ID,或者把子域名转成哈希去查缓存。一个坑是大小写问题,DNS不区分大小写,但数据库查询可能区分,统一转小写再处理比较稳妥。

这套方案不是没有代价。泛解析意味着任何乱七八糟的子域名都能解析到你的服务器,如果有人恶意扫 random123.example.com,你的应用得能正确处理——要么返回404,要么跳转到主站,不能直接抛500。另外SEO方面,搜索引擎可能把不同子域名当成不同站点,如果内容高度重复,权重会被分散。有些团队会在 robots.txt 里做限制,或者用canonical标签指回主域名。

我自己的经验是,泛解析最适合内部系统或者对SEO不敏感的场景。公开产品用的话,最好加一层子域名白名单校验,别让用户随便输入个不存在的子域名就触发一堆数据库查询。缓存也得做,子域名到租户ID的映射放在Redis里,别每次都查库。至于通配符证书,记得设个定时任务检查续期,Let's Encrypt的证书只有90天,过期那天整个泛解析域名全挂,那场面可不好看。

分享到: