在nginx中实现泛解析域名访问多子站,核心是配置server_name的通配符写法并用正则捕获子域名,配合泛解析的DNS记录,你就能让每个二级域名自动映射到对应站点目录。
nginx泛解析域名如何配置?先搞懂原理再动手
泛解析域名的本质是DNS层面把.example.com全部解析到同一台服务器IP,而nginx收到请求后,通过server_name匹配规则识别当前访问的子域名,再交给对应的站点配置处理。
比如你的主域名是yunwei.com,泛解析后blog.yunwei.com、shop.yunwei.com、demo.yunwei.com都会指向同一台nginx服务器,真正决定“谁是谁”的,是nginx配置文件里的server_name和root指令。
前置准备:DNS解析和服务器环境
- 在域名服务商后台添加一条记录,指向服务器公网IP,TTL设置为600秒或更低。
- 确保服务器已安装nginx,版本建议不低于1.18,旧的1.14也兼容但正则写法稍有差异。
- 确认防火墙开放80和443端口,如果要用HTTPS,还需要提前申请泛域名SSL证书(如Let's Encrypt通配符证书)。
基础配置示例:单文件匹配所有子站
打开nginx配置文件(通常位于/etc/nginx/conf.d/下),新建一个虚拟主机文件,例如subsites.conf:
server {
listen 80;
server_name ~^(?<sub>[\w-]+)\.yunwei\.com$;
root /var/www/$sub;
index index.html index.php;
if (!-e $request_filename) {
rewrite ^ /index.php last;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
这里的告诉nginx使用正则匹配,(?<sub>[\w-]+)把子域名部分捕获为变量$sub,然后root /var/www/$sub就自动指向/var/www/blog、/var/www/shop这样的目录,这个写法适合站点结构统一、访问量不大、每个子站独立目录的场景。
泛解析后多子站访问的nginx虚拟主机写法升级版
如果子站需要不同的PHP版本、不同根目录或独立日志,用上面的简单正则就不够灵活了,行业共识认为,生产环境最好每个子站写独立server块,配合正则捕获变量做跳转。
子站独立配置示例:
server {
listen 80;
server_name blog.yunwei.com;
root /var/www/blog;
access_log /var/log/nginx/blog.access.log;
error_log /var/log/nginx/blog.error.log;
}
server {
listen 80;
server_name shop.yunwei.com;
root /var/www/shop;
access_log /var/log/nginx/shop.access.log;
}
但这样写,新增子站就要手动加一个server块,并不算“自动泛解析”,想要自动化,建议用nginx的map模块按子域名映射到不同目录,再看具体路径转发给不同后端。
map $sub $site_root {
default /var/www/default;
blog /var/www/blog;
shop /var/www/shop;
}
server {
listen 80;
server_name ~^(?<sub>[\w-]+)\.yunwei\.com$;
root $site_root;
}
这样当你访问test.yunwei.com时,如果map里没定义,就会落到/var/www/default,避免404,业内专家指出,这种写法是泛解析配置中平衡灵活性与维护成本最常用的方案。
泛解析域名子站部署方案:静态页、动态程序还是反向代理?
根据子站类型不同,nginx泛解析的配置策略差别很大,很多新手把WordPress、ThinkPHP、Node.js服务混在一起,结果反复报错。
纯静态子站:一键目录映射
每个子站就是一个静态文件夹,无需后端处理,最简单的方式是直接使用第一节的root /var/www/$sub,确保目录权限正确,让nginx用户能读取,比如chown -R www-data:www-data /var/www。
动态PHP子站:区分pathinfo和伪静态
多数CMS需要伪静态和支持pathinfo访问,以博主的WordPress子站为例,配置里要加上:
location / {
try_files $uri $uri/ /index.php?$args;
}
对于ThinkPHP这类框架,需要额外配置fastcgi_split_path_info,否则子站URL会出现404 Not Found。
反向代理子站:把URL转发给后端服务
如果你搭建的是多个独立容器或不同语言的服务,nginx只做入口代理,配置里把root换成proxy_pass:
server {
server_name api.yunwei.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
此时用server_name直接写死子站域名更清晰,不需要正则捕获变量。
泛解析配置的坑:缓存、SSL证书和跨域问题
配置完泛解析后,访问子站常见的问题是“打开主域名正常,子站却跳到主站”或者“CSS样式乱了”,这些不是nginx正则写错了,而是更隐蔽的细节。
server_name默认匹配优先级
nginx里有多个server_name时,会先匹配精确域名,再匹配通配符,最后匹配正则,如果你的主域名配置文件里写了server_name yunwei.com www.yunwei.com;,它不会拦截blog.yunwei.com,但如果你写了server_name .yunwei.com;,那它和正则server块会冲突,具体取决于加载顺序,建议泛解析域名只用正则写法,不要同时存在通配符虚机。
HTTPS泛解析证书与强制跳转
泛解析证书签好后,HTTP访问需要301跳转到HTTPS,在server块里加上:
return 301 https://$host$request_uri;
注意这里的$host会保留子域名,千万不要写成$server_name,否则会跳到主域名。
跨域导致子站资源加载失败
多个子站共享同一个后端接口时,nginx要允许跨域,定位到子站配置的location里增加:
add_header Access-Control-Allow-Origin ;
但生产环境建议只允许特定子域名,否则安全风险较大。
泛解析实现自动新增子站的完整步骤
理解了配置原理,我们实际操作一次,假设服务器环境是Ubuntu 22.04 + nginx 1.22,目标让任何.example.com自动响应对应的/var/www/同名目录。
- 创建子站根目录:比如
mkdir -p /var/www/news,放入index.html。 - DNS添加泛解析:解析记录类型选
A,主机记录填,记录值填服务器IP。 - 修改nginx主配置:编辑
/etc/nginx/sites-available/default,把默认server注释或删除,加上我们之前写的正则server块。 - 重载nginx:
nginx -t检查语法无误后,执行systemctl reload nginx。 - 验证访问:浏览器打开
news.example.com,如果能显示/var/www/news,说明泛解析配置成功。
如果需要新增子站,只需要在/var/www/下新建目录即可,无需改动nginx配置,这个流程适合个人开发者批量部署演示环境。
泛解析域名与多子站访问的安全注意事项
泛解析给运维带来便利的同时,也会被恶意脚本扫描,网上很多子站被人批量解析用来发垃圾内容,就是因为配置了泛解析但没做访问控制。
- 限制ip访问:默认server块强制返回444,不要让未匹配的子域名暴露你的服务器。
- 限制脚本执行:对于上传目录,关闭PHP执行权限,用
location ~ /(uploads|files)/.\.php$ { deny all; }。 - 限流防刷:在server块中加入
limit_req zone=req_zone burst=5 nodelay;,避免泛解析域名被滥用。
常见问题解答
nginx泛解析配置后子站无法访问怎么办?
先确认DNS生效,在服务器上执行dig blog.yunwei.com,看是否解析到正确IP,再检查nginx配置里的正则是否匹配,使用curl -H "Host: blog.yunwei.com" http://127.0.0.1测试,返回200说明nginx配置没问题,问题在DNS或防火墙,另外查看/var/log/nginx/error.log确认是否有权限或路径错误。
泛解析如何让不同子站访问不同目录但不影响主域名?
你可以为主域名单独写一个精确匹配的server块,泛解析正则用^~或置于文件末尾,nginx优先匹配精确server_name,因此主域名走独立配置,其余子域名走泛解析正则,确保主域名的server块不要和正则重叠,比如只写server_name yunwei.com www.yunwei.com;即可。
nginx泛解析子站是否需要单独申请每个二级域名的SSL证书?
不需要,申请一张通配符证书,比如.yunwei.com,即可覆盖所有二级子站,只要证书包含该通配符域,子站就能正常使用HTTPS,但要注意通配符证书不支持三级域名,比如blog.dev.yunwei.com无法用.yunwei.com覆盖。