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

Nginx多级泛域名转子目录配置需求咨询

实现多级子域名到嵌套路径的Nginx配置方案

当然可以实现!我们可以利用Nginx的正则匹配和变量处理能力,将多级子域名拆分并映射到对应的嵌套路径中。下面分两种场景给出具体配置:

一、原生Nginx配置(支持有限级子域名)

如果你的业务中子域名级别不会太多(比如1-3级),可以用原生的set指令和正则匹配来处理,不需要额外模块:

server {
    listen 80;
    # 捕获domain.com前的所有子域名部分(比如b.a、c.b.a等)
    server_name "~^(?<sub>.+)\.domain\.com$";

    access_log /var/log/nginx/access_log_$sub.domain.com.log;
    error_log /var/log/nginx/error_log_$sub.domain.com.log;

    # 初始化子路径变量
    set $sub_path "";

    # 处理3级子域名:c.b.a.domain.com → 对应路径a/subdomains/b/subdomains/c
    if ($sub ~* "^(.+)\.(.+)\.(.+)$") {
        set $sub_path "$3/subdomains/$2/subdomains/$1";
    }
    # 处理2级子域名:b.a.domain.com → 对应路径a/subdomains/b
    if ($sub ~* "^(.+)\.(.+)$" && $sub_path = "") {
        set $sub_path "$2/subdomains/$1";
    }
    # 处理1级子域名:a.domain.com → 对应路径a
    if ($sub !~* "\." && $sub_path = "") {
        set $sub_path "$sub";
    }

    # 拼接最终的root路径
    set $root "/var/www/domain.com/subdomains/$sub_path/www/";
    root $root;

    index index.php index.html index.htm;
    # ... 这里保留你原有的其他配置(比如PHP处理规则等)
}

效果说明:

  • a.domain.com → 最终root路径:/var/www/domain.com/subdomains/a/www/
  • b.a.domain.com → 最终root路径:/var/www/domain.com/subdomains/a/subdomains/b/www/
  • c.b.a.domain.com → 最终root路径:/var/www/domain.com/subdomains/a/subdomains/b/subdomains/c/www/

如果需要支持更多级别,只需继续添加对应的if块即可,比如4级子域名可以增加匹配^(.+)\.(.+)\.(.+)\.(.+)$的规则。

二、Lua模块配置(支持任意级别子域名)

如果需要支持无限级的子域名,原生正则的方式会很繁琐,推荐使用Nginx的ngx_http_lua_module模块(OpenResty内置该模块,标准Nginx需手动编译添加),用Lua代码灵活处理:

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

    access_log /var/log/nginx/access_log_$sub.domain.com.log;
    error_log /var/log/nginx/error_log_$sub.domain.com.log;

    # 用Lua代码处理子域名拆分、反转和路径拼接
    set_by_lua_block $sub_path {
        -- 获取捕获到的子域名部分(比如b.a、d.c.b.a等)
        local sub = ngx.var.sub
        -- 按点分割子域名成数组
        local parts = {}
        for part in string.gmatch(sub, "[^.]+") do
            table.insert(parts, part)
        end
        -- 反转数组:比如{b,a} → {a,b},这样才能匹配嵌套路径的顺序
        local reversed_parts = {}
        for i = #parts, 1, -1 do
            table.insert(reversed_parts, parts[i])
        end
        -- 用/subdomains/连接各个部分,得到最终的子路径
        return table.concat(reversed_parts, "/subdomains/")
    }

    # 拼接最终root路径
    set $root "/var/www/domain.com/subdomains/$sub_path/www/";
    root $root;

    index index.php index.html index.htm;
    # ... 保留原有的其他配置
}

效果说明:

不管子域名有多少级,比如z.y.x.w.v.u.domain.com,都会自动处理成对应的嵌套路径:/var/www/domain.com/subdomains/u/subdomains/v/subdomains/w/subdomains/x/subdomains/y/subdomains/z/www/,完全满足任意级别子域名的需求。

内容的提问来源于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:02:32