服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-26 简米科技 4,512 字 11 分钟阅读

nginx泛解析域名如何配置实现多子站访问?,多站点怎么实现

导读在nginx中实现泛解析域名访问多子站,核心是配置server_name的通配符写法并用正则捕获子域名,配合泛解析的DNS记录,你就能让每个二级域名自动映射到对应站点目录,nginx泛解析域名如何配置?先搞懂原理再动手泛解析域名的本质是DNS层面把*.example.com全部解析到同一台服务器IP,而ngin……

在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/同名目录。

  1. 创建子站根目录:比如mkdir -p /var/www/news,放入index.html。
  2. DNS添加泛解析:解析记录类型选A,主机记录填,记录值填服务器IP。
  3. 修改nginx主配置:编辑/etc/nginx/sites-available/default,把默认server注释或删除,加上我们之前写的正则server块。
  4. 重载nginx:nginx -t检查语法无误后,执行systemctl reload nginx。
  5. 验证访问:浏览器打开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覆盖。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱