You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多子域名请求重定向至对应客户专属文件夹?

这种多子域名对应多客户目录的场景太常见了,我给你整理了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:44