servername定义服务器对外标识的权威域名和端口,usecanonicalname决定重定向等自动生成url时采用host头值(off)、servername值(on)或dns解析值(dns),二者配合可统一规范跳转链接。

ServerName 和 UseCanonicalName 是 Apache 中控制服务器标识与重定向行为的一对关键指令,配合得当能确保生成的跳转链接(如 301/302 重定向、Location 响应头、<base> 标签等)始终使用你期望的“正规主机名”,避免因用户访问方式不同(比如用 IP、别名、带端口、大小写混用等)导致 URL 不一致或 SEO 混乱。
ServerName 是基础标识,必须显式设置
它定义服务器对外自称的“权威名称+端口”,格式为 ServerName example.com:80(端口可省略,默认按协议推断)。这个值不参与 DNS 解析,只用于内部逻辑和响应构造:
- 若未设置,Apache 启动时可能警告,且某些模块(如 mod_rewrite 的
%{SERVER_NAME})行为不可靠; - 若设为 IP(如
ServerName 192.168.1.100),则所有自动生成的重定向都会以该 IP 出现,不利于外部访问和 HTTPS 部署; - 推荐设为已解析的完整域名(如
ServerName www.example.com),并确保该域名在客户端可访问(可通过 hosts 或 DNS 配合验证)。
UseCanonicalName 决定“用谁的名字生成链接”
它不改变 ServerName,而是告诉 Apache:当需要构造完整 URL(例如重定向、mod_dir 补全斜杠、mod_userdir 生成路径)时,该依据哪个来源取主机名。它有三个可选值:
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
Off:用请求中
Host头的原始值(含端口、大小写、甚至非法字符),最灵活但最不安全,容易被伪造或导致链接不统一; -
On:强制使用
ServerName+ServerPort构造 URL,完全忽略客户端 Host 头——适合单域名、端口固定、需强一致性的场景; - dns(仅 Apache 2.4+):先查 Host 头对应域名的 A/AAAA 记录,再反向解析 IP 得到规范主机名(要求 DNS 可靠且配置正确),较少用。
典型安全配置是 UseCanonicalName On,配合明确的 ServerName,这样所有重定向都走同一出口,比如用户访问 http://EXAMPLE.COM 或 http://www.example.com:8080,最终跳转到的都是 http://www.example.com/(不含端口)。
配合 RewriteRule 实现域名归一化重定向
仅靠 ServerName + UseCanonicalName 不会自动跳转,它只影响“Apache 自己生成的链接”。要真正把用户请求重定向到规范域名,还需搭配 mod_rewrite:
- 先启用重写引擎:
RewriteEngine On; - 判断 Host 不匹配规范名:
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]; - 执行 301 跳转(含协议和端口处理):
RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]; - 如需支持 HTTPS,建议在 SSL 虚拟主机中单独配置,并用
%{HTTPS} =on判断协议。
常见陷阱与验证方法
配置后务必检查是否生效:
- 用
curl -I http://example.com查看响应头中Location:是否为你设定的规范域名; - 访问一个不带尾部斜杠的目录(如
/admin),确认自动补全跳转是否使用了ServerName而非原始 Host; - 日志中
%v(实际 Host 头)和%V(UseCanonicalName 后的规范名)对比,可快速定位差异; - 避免
ServerAlias与ServerName混用在重定向逻辑里——ServerAlias仅用于匹配请求,不参与 URL 构造。










