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

