如何将多子域名请求重定向至对应客户专属文件夹?
这种多子域名对应多客户目录的场景太常见了,我给你整理了Nginx和Apache两种主流Web服务器的实现方案,还兼顾了公共代码库的访问需求,直接就能上手:
用Nginx实现的方案
Nginx的正则匹配和变量特性特别适合处理这种动态子域名映射,配置思路清晰且性能出色。
核心配置代码
server { listen 80; # 用正则捕获子域名前缀(比如从client1.example.com提取出client1) server_name ~^(?<client>[a-z0-9-]+)\.example\.com$; # 公共代码库专属路由:所有子域名都能通过/mymainrepo/访问公共资源 location /mymainrepo/ { root /path/to/your/actual/root/directory; try_files $uri $uri/ =404; # 如果有PHP等脚本需要执行,加上对应的fastcgi配置即可 } # 客户专属内容路由:自动导向对应client文件夹 location / { root /path/to/your/actual/root/directory/$client; try_files $uri $uri/ =404; # 同样,若需处理脚本,补充对应语言的执行配置 } }
关键说明
(?<client>[a-z0-9-]+)是正则捕获组,会把子域名的前缀(比如client1)存到$client变量里,后续用来动态指向客户目录/mymainrepo/的location确保公共代码库能被所有子域名直接访问,不用在每个客户目录里复制公共资源- 记得把
/path/to/your/actual/root/directory替换成你服务器上的真实根目录路径
用Apache实现的方案
Apache需要启用mod_rewrite和mod_vhost_alias两个模块,下面提供两种可选配置方式:
方式1:用VirtualDocumentRoot动态映射
这种方式最简洁,适合批量处理子域名:
# 先确认启用必要模块(通常在httpd.conf或apache2.conf里配置) LoadModule rewrite_module modules/mod_rewrite.so LoadModule vhost_alias_module modules/mod_vhost_alias.so <VirtualHost *:80> ServerName example.com ServerAlias *.example.com # 动态生成文档根目录:把client1.example.com映射到根目录下的client1文件夹 VirtualDocumentRoot /path/to/your/actual/root/directory/%1 # 配置公共代码库的别名,让所有子域名都能访问 Alias /mymainrepo /path/to/your/actual/root/directory/mymainrepo <Directory /path/to/your/actual/root/directory/mymainrepo> Require all granted AllowOverride All </Directory> # 确保客户目录的访问权限 <Directory /path/to/your/actual/root/directory/*> Require all granted AllowOverride All </Directory> </VirtualHost>
%1对应*.example.com中的通配符部分,也就是子域名的前缀(client1、client2等)
方式2:用RewriteRule手动匹配
如果不想启用mod_vhost_alias,可以用Rewrite规则来实现:
<VirtualHost *:80> ServerName example.com ServerAlias *.example.com RewriteEngine On # 捕获子域名前缀到%1变量 RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$ [NC] # 除了/mymainrepo开头的请求,其余都重定向到对应客户目录 RewriteRule !^/mymainrepo /%1%{REQUEST_URI} [L] # 公共代码库别名配置(和方式1一致) Alias /mymainrepo /path/to/your/actual/root/directory/mymainrepo <Directory /path/to/your/actual/root/directory/mymainrepo> Require all granted </Directory> </VirtualHost>
通用注意事项
- 权限检查:确保Web服务器进程(比如Nginx的
www-data、Apache的apache/httpd)对所有客户目录和mymainrepo有读取权限,脚本文件需要额外的执行权限 - HTTPS适配:如果需要启用HTTPS,记得配置通配符SSL证书(
*.example.com),Nginx添加listen 443 ssl;并指定证书路径,Apache启用SSLEngine on并配置证书 - 配置测试:修改配置后一定要重启Web服务器(Nginx:
sudo systemctl restart nginx;Apache:sudo systemctl restart apache2),然后用curl或浏览器测试子域名是否正确跳转 - 默认处理:可以添加一个默认的Server块(Nginx)或VirtualHost(Apache),处理非预期的子域名请求(比如跳转到主域名或返回404)
内容的提问来源于stack exchange,提问作者Asim Zaidi
相关产品推荐
相关产品推荐

