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

如何优雅将非www/www域名重定向至指定子域名(如main/app)

问题描述
  • 基于django-tenants架构,public schema为空,计划将main.example.com作为服务着陆页及所有租户的主入口,需将example.com和www.example.com的流量重定向至该子域名,同时维持现有数据库结构。
  • 当前Nginx配置可正常运行,但无法适配未来新增大量租户子域名的场景:每次新增租户都需要手动修改第三个server块的server_name列表。
  • 尝试将第三个server块的server_name改为.example.com或main.example.com .example.com时,出现循环重定向问题,请求始终被导向main.example.com。
解决思路

方案1:利用Nginx server_name匹配优先级(推荐)

Nginx的server_name匹配优先级为:精确匹配 > 通配符前缀 > 正则匹配 > 通配符后缀,利用这个特性可以避免循环重定向:

# 所有HTTP请求强制跳转至HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name .example.com;
    return 301 https://$host$request_uri;
}

# 精确匹配根域名和www域名,跳转至main子域名
server {
    listen 443 ssl;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;
    return 301 https://main.example.com$request_uri;
}

# 匹配所有子域名(包括main),直接处理请求
server {
    listen 443 ssl;
    listen [::]:443 ssl http2;
    server_name .example.com;

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }
}

原理:

  • 当请求为example.com或www.example.com时,会被第二个server块(精确匹配)拦截,重定向到main.example.com;
  • main.example.com及其他租户子域名会匹配第三个server块的通配符后缀.example.com,直接处理请求,不会触发重定向,彻底避免循环问题;
  • 新增租户子域名时无需修改Nginx配置,自动适配。

方案2:正则匹配精准控制子域名

如果需要更严格的子域名访问控制(比如限制租户子域名格式),可以使用正则匹配:

# HTTP转HTTPS配置不变
server {
    listen 80;
    listen [::]:80;
    server_name .example.com;
    return 301 https://$host$request_uri;
}

# 根域名和www域名重定向配置不变
server {
    listen 443 ssl;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;
    return 301 https://main.example.com$request_uri;
}

# 正则匹配指定格式的子域名(示例:main或sub+数字的子域名)
server {
    listen 443 ssl;
    listen [::]:443 ssl http2;
    server_name ~^(main|sub\d+)\.example\.com$;

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
        try_files $uri $uri/ /index.html;
    }
}

优势:只允许符合规则的子域名访问,提升安全性;可根据租户子域名的命名规则调整正则表达式。

注意事项
  • 确保使用通配符SSL证书(*.example.com),否则部分子域名的HTTPS访问会出现证书错误;
  • 测试阶段建议使用302临时重定向,确认配置正常后再改为301永久重定向(避免浏览器缓存错误配置);
  • 配合django-tenants时,需确保框架能正确识别main.example.com作为公共入口,其他子域名对应各自租户的schema。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:25:48