ServerName 和 ServerAlias 之间的区别

ServerName 和 ServerAlias 之间的区别

我不太清楚 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

服务器名称指令是

服务器用来标识自己的主机名和端口

同时服务器别名

将请求匹配到名称虚拟主机时使用的主机备用名称

假设 vhost 配置如下

 ...
 ServerName example.com
 ServerAlias www.example.com foo.example.com *.somewherelse.org
 ...

apache 将响应example.comwww.example.com foo.example.com以及.somewherelse.org此 VirtualHost 中的任何内容

答案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 中使用其自己的名称(例如目录列表的重定向)时将使用的名称。

相关内容