最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中 URL 重写如何实现二级域名自动转发到对应用户目录
时间:2026-08-23 12:11:49 编辑:袖梨 来源:一聚教程网
Nginx可通过通配server_name捕获子域名并动态映射用户目录,核心是正则提取$host中的合法子域名,结合rewrite跳转或root/alias动态路径,配合白名单过滤与try_files防护路径穿越。
用 Nginx 实现二级域名自动转发到对应用户目录,核心是捕获子域名并动态映射为路径,不依赖硬编码每个子域。关键在 server_name 的通配匹配 + rewrite 或 root 变量拼接,配合安全防护避免路径穿越。
用通配 server_name 捕获子域名
必须启用泛域名解析(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 等保留名
重写 URL 到用户目录(显性跳转)
适合对外暴露新路径、SEO 友好、浏览器地址栏同步更新的场景:
- 使用
rewrite+permanent返回 301 跳转:rewrite ^/(.*)$ /u/$user/$1 permanent; - 确保目标路径存在对应 location 处理,例如:
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;便于调试重写逻辑