参数说明
ServerName
作用:指定虚拟主机的主域名。
匹配规则:当客户端请求的域名与 ServerName 匹配时,Apache 会将请求路由到对应的虚拟主机。
格式:ServerName example.com
注意事项:
- 每个虚拟主机必须有一个唯一的 ServerName。
- ServerName 不需要包含 www,可以根据需要选择主域名(通常选择没有 www 的形式)。
ServerAlias
作用:为虚拟主机定义别名,可以匹配多个域名。
匹配规则:当客户端请求的域名与 ServerAlias 中的任一域名匹配时,Apache 会将请求路由到对应的虚拟主机。
格式:
ServerAlias www.example.com *.example.com
注意事项:
- 可以使用通配符(如 *.example.com)匹配子域名。
- 可用于支持多种域名访问同一站点。
如果有两个域名需要绑定到同一个站点,推荐的写法是?
使用一个 ServerName,另一个作为 ServerAlias,这种方式更清晰,也更符合 Apache 的设计原则。
<VirtualHost *:80>
ServerName example.com
ServerAlias example.org
DocumentRoot “/var/www/example”
<Directory “/var/www/example”>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
原因与优势
ServerName
定义主域名:
- 它表示服务器的主要入口,访问时会优先匹配该域名。
- 通常选择一个简洁的域名(例如不带
www
的版本)。
ServerAlias
用于附加域名:
- 更容易扩展:可以轻松添加其他域名。
- 避免重复配置:多个
ServerName
会增加不必要的复杂性。
- 减少错误和冲突:
- 如果写多个
ServerName
(例如多个虚拟主机),Apache 会认为它们是独立的配置,可能引发路由冲突。
- 对 SEO 友好:
- 在服务器中配置一个主域名,可以结合 301 重定向,将所有其他域名重定向到主域名,集中流量和权重。
不建议写多个 ServerName 的理由:
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName example.org
</VirtualHost>
- Apache 会认为这是两个不同的虚拟主机,而不是绑定到同一个站点。
- 会导致配置混乱,可能需要在两个地方重复设置相同的内容(例如
DocumentRoot
)。
- 对于 HTTPS,还可能要求分别配置 SSL 证书,增加管理复杂度。
ServerAlias 中 www.example.com *.example.com 这种写法是否重复?
虽然通配符已经包含了 www,但为了清晰起见,某些情况下可以保留显式的 www.example.com