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

Nginx中如何在单个server块内实现多子域名重定向?

如何在单个Nginx server块内实现多子域名重定向?

当然可以!你现在逐个写server块的方式确实太繁琐了,尤其有10个左右子域名的时候,维护起来也麻烦。我给你分享两种实用的方法,都能在单个server块搞定:

方法一:通配符+变量提取快速实现

这种方式最直接,用通配符匹配所有子域名,再通过变量提取子域名前缀替换后缀:

server {
    listen 80;
    # 匹配所有example.com的子域名(比如firstsub.example.com、secondsub.example.com)
    server_name *.example.com;
    
    # 提取子域名前缀(去掉.example.com后缀)
    set $subdomain $host;
    if ($subdomain ~* "^(.+)\.example\.com$") {
        set $subdomain $1;
    }
    
    # 重定向到目标域名,同时保留原请求路径
    return 301 $scheme://$subdomain.anothersite.co$request_uri;
}

方法二:用map指令实现灵活映射(支持例外场景)

如果之后有些子域名需要特殊处理(比如不重定向、定向到其他域名),用map指令会更方便。先在http全局块里定义映射规则,再在server块里调用:

首先,在你的Nginx配置的http块中添加:

map $host $target_domain {
    # 默认值为空,避免无匹配时出错
    default "";
    # 匹配所有example.com的子域名,替换成目标后缀
    ~^([^.]+)\.example\.com$ $1.anothersite.co;
    # 可以添加例外规则,比如某个子域名定向到特殊地址
    # thirdsub.example.com thirdsub.myothersite.com;
    # 或者某个子域名不重定向,留空即可
    # specialsub.example.com "";
}

然后添加对应的server块:

server {
    listen 80;
    server_name *.example.com;
    
    # 只有当匹配到目标域名时才执行重定向
    if ($target_domain != "") {
        return 301 $scheme://$target_domain$request_uri;
    }
    
    # 未匹配的情况直接断开连接(根据需求调整,比如返回404)
    return 444;
}

一些注意事项

  • 测试阶段建议用302临时重定向,避免浏览器缓存永久重定向规则导致测试麻烦,确认无误后再改成301。
  • 修改配置后,一定要用nginx -t命令检查配置语法是否正确,没问题再执行nginx -s reload重新加载配置。
  • 如果你的子域名包含多级(比如a.b.example.com),上述方法的正则需要调整,比如~^(.+)\.example\.com$会捕获a.b作为子域名部分,如果你只想捕获最外层的子域名,正则要改成~^([^.]+)\.[^.]+\.example\.com$之类的,根据实际情况调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:05:46