ServerName不支持正则,仅接受静态域名;需模式匹配时应结合ServerAlias通配符(如*.example.com)或RewriteCond+RewriteRule提取子域名并路由。

Apache 的 ServerName 指令本身**不支持正则表达式**,它只接受精确的、静态的域名字符串(如 www.example.com 或 example.com)。若需按模式匹配子域名(比如匹配 user1.example.com、api.example.com 等),必须借助 VirtualHost + RewriteCond + RewriteRule 组合,或使用 ServerAlias 配合通配符(有限支持)。
用 ServerAlias 实现简单通配(非正则,但实用)
如果只需覆盖一组已知或有限变体的子域名,可使用 ServerAlias 并配合星号(*)——注意:这是 DNS 层级的“泛解析”前提下的 Apache 侧配合,并非正则引擎解析:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
ServerAlias *.example.com—— Apache 2.4+ 支持该语法,表示接受任意一级子域名(如a.example.com、test.example.com),但www.example.com和example.com仍需单独列出或用额外别名覆盖 - 该写法依赖 DNS 已配置
*.example.com的 A/CNAME 记录指向本服务器 IP - 它不进行字符提取或条件判断,仅用于路由到该虚拟主机
用 RewriteCond 提取并识别子域名(真正按规则匹配)
当需要对子域名做逻辑判断(例如:只放行以 app- 开头的子域名,或排除 dev.、staging.)、或把子域名作为参数传递给后端时,必须用 RewriteCond 匹配 %{HTTP_HOST}:
-
RewriteCond %{HTTP_HOST} ^([a-z0-9]+)\.example\.com$ [NC]—— 捕获子域名部分到%1,忽略大小写 -
RewriteCond %{HTTP_HOST} ^(app-[a-z0-9]+)\.example\.com$ [NC]—— 仅匹配app-开头的子域名 -
RewriteCond %{HTTP_HOST} !^(www|api|static)\.example\.com$ [NC]—— 排除特定子域名 - 后续
RewriteRule可引用%1(来自RewriteCond)或$1(来自RewriteRule自身匹配)
典型动态子域名处理流程(含路径重写过渡)
要实现类似 blog.user1.example.com → example.com/user.php?u=user1 这类效果,需两步重写(因 RewriteRule 不匹配 Host):
- 第一步:用
RewriteCond判断 Host,将子域名注入 URL 路径(如重写为/_subdomain:user1/...) - 第二步:再用
RewriteRule匹配该临时路径,提取并转发到真实脚本 - 示例片段(放在
<VirtualHost>或.htaccess中):
RewriteCond %{HTTP_HOST} ^([a-z0-9\-]+)\.example\.com$ [NC]
RewriteRule ^(.*)$ /subdomain.php?name=%1&path=$1 [QSA,L]
注意事项与限制
-
ServerName和ServerAlias中的*是通配符,不是正则;不支持+、?、{n}等正则语法 - 所有基于 Host 的条件判断,都依赖客户端正确发送
Host:请求头(HTTP/1.1 必须携带) - 确保
mod_rewrite已启用,且AllowOverride All(对 .htaccess)或直接在虚拟主机中配置 - 若用泛解析 DNS,请确认无安全风险(如未授权子域名被滥用)

















