ServerName 决定 Apache 如何识别请求并应用重定向规则,必须与实际访问域名一致且每个 VirtualHost 都需明确配置;写错会导致重定向失效、跳错或被兜底处理。
ServerName 本身不执行重定向,但它和重定向规则紧密配合——它决定了 Apache 怎么识别请求、该把重定向规则应用到哪个站点上。写错 ServerName,重定向可能不生效、跳错地址,甚至被当成默认站兜底处理。
每个 块里都要有明确的 ServerName,否则 Apache 无法准确匹配请求来源,重定向就容易“认错人”:
重定向逻辑写在对应 VirtualHost 块内,前提是 ServerName 已正确定义,Apache 才知道这条规则属于谁:
Redirect permanent / https://example.com/
注意:这里用的是 ServerName 定义的域名,不是硬编码 IP 或其他别名
在 ServerName 为 example.com 的块里写:
Redirect permanent / https://example.com/
在 ServerName 为 www.example.com 的块里写:
Redirect permanent / https://example.com/
必须先写 RewriteEngine On,再通过 %{HTTP_HOST} 判断是否匹配当前 ServerName:
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
很多重定向“写了却不跳”,问题常出在 ServerName 和配置结构不匹配:
一个干净、可维护的双协议配置片段:
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
ServerName example.com
ServerAlias www.example.com
SSLEngine on
# …证书配置
# 此处可加内部跳转,如 /old → /new
</VirtualHost>