Nginx可通过通配server_name捕获子域名并动态映射用户目录,核心是正则提取$host中的合法子域名,结合rewrite跳转或root/alias动态路径,配合白名单过滤与try_files防护路径穿越。
用 Nginx 实现二级域名自动转发到对应用户目录,核心是捕获子域名并动态映射为路径,不依赖硬编码每个子域。关键在 server_name 的通配匹配 + rewrite 或 root 变量拼接,配合安全防护避免路径穿越。
必须启用泛域名解析(DNS A 记录指向服务器 IP),Nginx 才能接收任意二级域名请求:
server_name *.example.com;,让该 server 块响应所有 xxx.example.com 请求$host 获取完整主机名,再通过正则提取子域名部分if ($host ~* ^([a-z0-9-]+).example.com$) { set $user $1; } —— 仅匹配合法子域名,过滤掉 www、mail 等保留名适合对外暴露新路径、SEO 友好、浏览器地址栏同步更新的场景:
rewrite + permanent 返回 301 跳转:rewrite ^/(.*)$ /u/$user/$1 permanent;
location /u/ { alias /var/www/users/; }
$user 是否为空或含非法字符(如 ..、/),否则 return 403用户仍看到原二级域名,但实际加载对应目录内容,适合 SaaS 多租户架构:
root 指令动态拼接:root /var/www/users/$user;
alias 配合 rewrite:
rewrite ^/(.*)$ /$1 break;
alias /var/www/users/$user/;
try_files $uri $uri/ =404; 防止路径遍历,且禁止 autoindex on;
二级域名自动映射极易引发越权或 403/404,上线前务必验证:
^ 和 $),避免 admin.example.com 被误判为 min.example.com
$user 做白名单过滤:if ($user ~* "[^a-z0-9-]") { return 403; }
/var/www/users/)而非相对路径rewrite_log on; 和 error_log ... notice; 便于调试重写逻辑