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
相关产品推荐
相关产品推荐

