You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置多级子域名映射至不同根目录的技术问询

实现多级子域名对应嵌套目录的Nginx配置

当然可以实现你的需求!不过这里有个关键细节需要注意:你的初始思路是直接将子域名中的.替换为/subdomains/,但按照你给出的目录规则,子域名的层级顺序需要反转(比如test.abc.domain.com对应abc/subdomains/test,而非test/subdomains/abc),所以我们需要先反转子域名的层级顺序,再做替换。

下面提供两种可行方案,你可以根据自己的环境选择:

方案1:原生Nginx指令(无需第三方模块)

如果你的Nginx没有安装额外模块,可以通过多次rewrite指令来处理子域名的反转和替换。这种方案适合子域名层级较少(比如最多3-4级)的场景:

server {
    listen 80;
    listen [::]:80;

    # 捕获完整的多级子域名部分(比如hello.test.abc)
    server_name "~^(?<sub>.+)\.domain\.com$";

    # 第一步:反转子域名的层级顺序
    set $reversed_sub $sub;
    # 处理3级子域名:a.b.c → c.b.a
    rewrite ^([^.]+)\.([^.]+)\.([^.]+)$ $3.$2.$1 break;
    # 处理2级子域名:a.b → b.a
    rewrite ^([^.]+)\.([^.]+)$ $2.$1 break;
    # 1级子域名无需处理,保持原内容

    # 第二步:将反转后的子域名中的`.`替换为`/subdomains/`
    set $subRoot "/subdomains/$reversed_sub";
    rewrite ^(/subdomains/[^.]+)\.([^.]+)$ $1/subdomains/$2 break;
    rewrite ^(/subdomains/[^.]+)\.([^.]+)\.([^.]+)$ $1/subdomains/$2/subdomains/$3 break;

    # 最终设置根目录
    set $root /var/www/domain.com$subRoot/www/;
    root $root;

    # 其他配置(比如location、日志等)
    ...
}

效果验证

  • abc.domain.com → /var/www/domain.com/subdomains/abc/www/
  • test.abc.domain.com → /var/www/domain.com/subdomains/abc/subdomains/test/www/
  • hello.test.abc.domain.com → /var/www/domain.com/subdomains/abc/subdomains/test/subdomains/hello/www/

方案2:使用Lua模块(更灵活,支持任意层级)

如果你的Nginx安装了ngx_http_lua_module(比如通过OpenResty),可以用Lua代码更简洁地处理任意层级的子域名,无需担心层级限制:

server {
    listen 80;
    listen [::]:80;

    server_name "~^(?<sub>.+)\.domain\.com$";

    # 用Lua代码处理子域名反转和路径拼接
    set_by_lua_block $subRoot {
        local sub = ngx.var.sub
        -- 将子域名按`.`分割成数组
        local parts = {}
        for part in string.gmatch(sub, "[^.]+") do
            table.insert(parts, part)
        end
        -- 反转数组顺序
        local reversed_parts = {}
        for i = #parts, 1, -1 do
            table.insert(reversed_parts, parts[i])
        end
        -- 拼接成目标路径格式
        return "/subdomains/" .. table.concat(reversed_parts, "/subdomains/")
    }

    # 设置根目录
    root /var/www/domain.com$subRoot/www/;

    # 其他配置
    ...
}

这种方案的优势是不管子域名有多少层级,都能自动处理,非常灵活。

注意事项

  1. 确保你的Nginx配置中开启了正则表达式支持(server_name使用~开头的正则)。
  2. 如果使用Lua方案,需要确保Nginx已编译ngx_http_lua_module或直接使用OpenResty。
  3. 测试配置前可以用nginx -t检查语法是否正确,避免配置错误导致服务重启失败。

内容的提问来源于stack exchange,提问作者pet21221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:19