我不太清楚 ServerName 和 ServerAlias 之间的区别。它们似乎都可以用作主机名设置,只不过 ServerAlias 仅在 <VirtualHost> 标签内有效。
也就是说,我可以这样做:
ServerName www.domain1.com
ServerName www.domain2.com
或者:
<VirtualHost *:80>
ServerName www.domain1.com
ServerName www.domain2.com
</VirtualHost>
并且两个域都在同一台机器上工作。在这种情况下我可以使用 ServerName 或 ServerAlias 吗?
答案1
答案2
我通过实验(基于必要性)发现的一个关键区别是,当与通配符子域一起使用时(例如“*.mycompany.com”和“*.mycompany.net”),则必须将通配符指定为 ServerAlias 而不是 ServerName。
我还没有尝试过非 SSL,但 SSL 确实如此(对我来说)。我决定采用以下配置:
Listen *:8443
NameVirtualHost *:8443
SSLStrictSNIVHostCheck off
<VirtualHost *:8443>
ServerName mycompany.com
ServerAlias *.mycompany.com
...
</VirtualHost>
<VirtualHost *:8443>
ServerName mycompany.net
ServerAlias *.mycompany.net
...
</VirtualHost>
当使用“ServerName *.mycompany.net”时,始终使用第一个虚拟主机。这不仅仅是证书,它还重写并代理逻辑。
这完全有可能只发生在 SSL 上,因为还有一大堆其他的事情发生 - 就像在使用 SNI 的虚拟主机的 SSL以及许多 ServerFault 线程。遵循了这些建议后,这是最后一个令人头疼的问题。
我来到这个帖子是为了尝试自己理解为什么会有差异,我承认我已经更接近理解了,但还没有完全理解。
就我而言,ServerName 似乎做得少一些(在虚拟主机搜索中没有被选中),而不是更多。
按照 Iain 的建议运行“apacectl -S | httpd -S”得到以下结果:
wildcard NameVirtualHosts and _default_ servers:
*:8443 is a NameVirtualHost
default server mycompany.com (/etc/httpd/conf/httpd.conf:1100)
port 8443 namevhost mycompany.com (/etc/httpd/conf/httpd.conf:1100)
wild alias *.mycompany.com
port 8443 namevhost mycompany.net (/etc/httpd/conf/httpd.conf:1164)
wild alias *.mycompany.net
编辑:(为了完整性,添加带有通配符的 ServerName)
wildcard NameVirtualHosts and _default_ servers:
*:8443 is a NameVirtualHost
default server *.mycompany.com (/etc/httpd/conf/httpd.conf:1040)
port 8443 namevhost *.mycompany.com (/etc/httpd/conf/httpd.conf:1040)
port 8443 namevhost *.mycompany.net (/etc/httpd/conf/httpd.conf:1105)
注意:在第一种情况下(使用 ServerAlias),别名行中的单词“wild”来自 apache,而在第二种情况下(使用 ServerName)它没有显示 - 我怀疑这很重要。
此外,如果我从第二个 VirtualHost 中删除“ServerName”,并按照“应该只有一个 ServerName”的建议使用别名,那么请求就会有点丢失 - 似乎会自动重定向到“https://test.mycompany.net:8443“- 因为(在我的情况下)8443 没有显示外部(nat'd),所以它失败了。是的,我知道对于 443 来说这可能有效,但可能表明发生了其他事情。
因此,这也许不是问题的答案,而只是为在类似设置中苦苦挣扎的其他人提供了一些文档。
答案3
在处理软件时,拥有一个单一的真相点通常很重要。ServerName
可以被视为主机的“真实”规范名称。ServerAlias
不是。
ServerName
完成所有功能ServerAlias
,甚至更多。最佳实践是只设置一个 ServerName,因为任何东西都只能有一个“规范”。如果ServerName
没有明确设置,httpd 将自行确定名称。
ServerAlias
另一方面,只是一个别名,只能在 VirtualHost 上下文中使用。您可以根据需要设置任意数量的别名。
如果网站通过 HTTPS 提供服务,那么ServerName 应与证书中包含的名称之一匹配。如果您的证书是为 www.example.org 创建的,但您的配置显示:
ServerName foo.example.org
ServerAlias www.example.org
然后 Apache 将会抱怨以下错误:
12 月 10 日 13:23:45 web1 httpd[1234]: [警告] RSA 服务器证书 CommonName (CN) `www.example.org' 与服务器名称不匹配!?
答案4
ServerName 是 apache 在必须在 URL 中使用其自己的名称(例如目录列表的重定向)时将使用的名称。