Apache配置子域名本质是配置基于名称的虚拟主机,需为每个子域名设置独立VirtualHost块、唯一ServerName、对应DocumentRoot及Require all granted权限,并确保DNS解析生效或hosts映射正确。

Apache 配置子域名,本质是配置基于名称的虚拟主机(Name-based VirtualHost),让不同子域名(如 blog.example.com、api.example.com)指向各自独立的网站目录和行为。关键不是“特殊语法”,而是正确设置 ServerName 和 ServerAlias,并确保 DNS 解析到位。
子域名必须走基于域名的虚拟主机
Apache 不区分“主域名”和“子域名”,只认 Host 请求头。只要你在 <VirtualHost> 中写明 ServerName blog.example.com,它就专用于响应这个 Host 请求。多个子域名就是多个独立的 <VirtualHost> 块。
- ✅ 正确:
ServerName shop.example.com - ✅ 正确:
ServerName admin.example.com - ❌ 无效:试图用一个
<VirtualHost>同时匹配所有子域名却不做泛解析(除非配合mod_vhost_alias)
每个子域名配一个 VirtualHost(推荐、清晰、可控)
适合子域名数量不多(比如 <10 个)、每个需要定制权限/日志/SSL 的场景。
<VirtualHost *:80>
ServerName blog.example.com
DocumentRoot "/var/www/blog"
<Directory "/var/www/blog">
Require all granted
Options FollowSymLinks
</Directory>
ErrorLog ${APACHE_LOG_DIR}/blog_error.log
CustomLog ${APACHE_LOG_DIR}/blog_access.log combined
</VirtualHost>
<VirtualHost *:80>
ServerName api.example.com
DocumentRoot "/var/www/api"
<Directory "/var/www/api">
Require all granted
AllowOverride None
</Directory>
# 可单独加 CORS、API 限流等配置
</VirtualHost>要点:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 每个
<VirtualHost>必须有唯一的ServerName -
DocumentRoot路径需真实存在,且 Apache 进程(如www-data)有读取权限 -
Require all granted是 Apache 2.4+ 必需的授权指令,漏掉会 403 - 日志路径建议分开,便于排查各子域名问题
DNS 必须提前生效
子域名配置再对,DNS 不解析也白搭:
- 在域名管理后台为每个子域名添加 A 记录,例如:
blog.example.com → 203.0.113.45api.example.com → 203.0.113.45 - 本地测试可用修改
hosts文件临时映射(Windows:C:\Windows\System32\drivers\etc\hosts;Linux/macOS:/etc/hosts):127.0.0.1 blog.example.com api.example.com
泛子域名(如 user1.example.com、user2.example.com)用 mod_vhost_alias
如果子域名动态生成(用户注册自动开通),不建议手动写几十个 <VirtualHost>。改用 mod_vhost_alias:
- 确保已启用模块:
a2enmod vhost_alias - DNS 做泛解析:
*.example.com → 你的服务器 IP - 配置示例:
<VirtualHost *:80> ServerName example.com ServerAlias *.example.com UseCanonicalName Off VirtualDocumentRoot /var/www/%1 <Directory "/var/www"> Require all granted Options FollowSymLinks </Directory> </VirtualHost>访问
alice.example.com→ 自动找/var/www/alice目录;bob.example.com→/var/www/bob
⚠️ 注意:%1是 Host 头第一个点前的部分,/var/www/alice必须存在且权限正确(chmod 755),否则 404 或 403。
HTTPS 子域名不能省事
每个需要 HTTPS 的子域名,都得有对应证书:
- 单域名证书:为
blog.example.com单独申请 - 通配符证书(推荐):用 Let’s Encrypt 申请
*.example.com,覆盖所有一级子域名certbot certonly --manual -d example.com -d *.example.com
- 在
<VirtualHost *:443>中加载证书,并开启 SSL:SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
不复杂但容易忽略

















