Nginx 中 URL 重写如何实现二级域名自动转发到对应用户目录

作者:袖梨 2026-08-23

Nginx可通过通配server_name捕获子域名并动态映射用户目录,核心是正则提取$host中的合法子域名,结合rewrite跳转或root/alias动态路径,配合白名单过滤与try_files防护路径穿越。

用 Nginx 实现二级域名自动转发到对应用户目录,核心是捕获子域名并动态映射为路径,不依赖硬编码每个子域。关键在 server_name 的通配匹配 + rewriteroot 变量拼接,配合安全防护避免路径穿越。

用通配 server_name 捕获子域名

必须启用泛域名解析(DNS A 记录指向服务器 IP),Nginx 才能接收任意二级域名请求:

  1. 配置 server_name *.example.com;,让该 server 块响应所有 xxx.example.com 请求
  2. 用内置变量 $host 获取完整主机名,再通过正则提取子域名部分
  3. 推荐写法:if ($host ~* ^([a-z0-9-]+).example.com$) { set $user $1; } —— 仅匹配合法子域名,过滤掉 www、mail 等保留名

重写 URL 到用户目录(显性跳转)

适合对外暴露新路径、SEO 友好、浏览器地址栏同步更新的场景:

  1. 使用 rewrite + permanent 返回 301 跳转:

    rewrite ^/(.*)$ /u/$user/$1 permanent;

  2. 确保目标路径存在对应 location 处理,例如:

    location /u/ { alias /var/www/users/; }

  3. 加防护:跳转前检查 $user 是否为空或含非法字符(如 ../),否则 return 403

内部重写到用户目录(隐性访问)

用户仍看到原二级域名,但实际加载对应目录内容,适合 SaaS 多租户架构:

  1. root 指令动态拼接:

    root /var/www/users/$user;

  2. 或用 alias 配合 rewrite

    rewrite ^/(.*)$ /$1 break;

    alias /var/www/users/$user/;

  3. 必须加 try_files $uri $uri/ =404; 防止路径遍历,且禁止 autoindex on;

安全与稳定性要点

二级域名自动映射极易引发越权或 403/404,上线前务必验证:

  1. 子域名提取正则要锚定开头结尾(^$),避免 admin.example.com 被误判为 min.example.com
  2. $user 做白名单过滤:if ($user ~* "[^a-z0-9-]") { return 403; }
  3. 用户目录路径必须绝对安全,建议用固定前缀(如 /var/www/users/)而非相对路径
  4. 开启 rewrite_log on;error_log ... notice; 便于调试重写逻辑

相关文章

精彩推荐