在 nginx 中配置二级域名作为用户专属空间,核心做法是利用正则表达式匹配 `server_name` 中的子域名部分,并将其捕获为变量,随后在 `location` 块中将该变量映射到对应的文件系统路径。这样做可以让 nginx 根据请求的域名自动路由到 `/data/user1`、`/data/user2` 等独立目录,实现多租户隔离。

如何提取子域名并映射到本地路径
通过设置 server_name ~^(? 可以捕获子域名,并在 root 指令中使用 /var/www/$subdomain 动态指定根目录。这要求 Nginx 版本支持正则捕获组(Nginx 0.7.48+ 均支持),且 DNS 需将所有子域名解析到服务器 IP。

server {
listen 80;
server_name ~^(?<subdomain>.+).example.com$;
root /var/www/$subdomain/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}</subdomain>
假设 DNS 将 alice.example.com 指向服务器 IP,访问该域名时,Nginx 会提取 alice 赋值给 $subdomain,最终读取路径为 /var/www/alice/public_html。若目录不存在,Nginx 返回 404。此配置仅依赖文件系统结构,无需额外模块。
如何处理非标准端口或 HTTPS 场景
HTTPS 场景下需确保证书覆盖所有子域名(使用通配符证书 *.example.com),并将相同的 server_name 正则逻辑应用于 443 端口监听块。同时需配置 SSL 协议和加密套件,确保传输安全。若需强制 HTTP 跳转 HTTPS,可在 80 端口块中添加重定向规则,但用户专属空间的逻辑仍需在 443 块中实现。

server {
listen 443 ssl;
server_name ~^(?<subdomain>.+).example.com$;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
root /var/www/$subdomain/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}</subdomain>
当访问 https://bob.example.com 时,Nginx 验证通配符证书有效性后,提取 bob 并加载 /var/www/bob/public_html 内容。若证书未包含该子域名,浏览器将报错。此配置与 HTTP 版逻辑一致,仅增加 SSL 上下文。
当子域名包含连字符或数字时路径是否有效
正则表达式 (? 会匹配任意非点号字符,包括连字符和数字,因此 user-1.example.com 或 test123.example.com 均可正确提取 user-1 或 test123 作为路径名。只要文件系统允许这些字符作为目录名(Linux 默认允许),Nginx 即可正常路由。需注意避免注入攻击,如子域名包含 ../ 等路径遍历序列,应通过正则限制合法字符集,例如 (?。











