ServerName 和 ServerAlias 的区别

Sum*_*man 36 apache-2.2

我不太清楚 ServerName 和 ServerAlias 之间的区别。看起来它们都用作主机名设置,除了 ServerAlias 仅在 <VirtualHost> 标签内工作。

也就是说,我可以这样做:

ServerName www.domain1.com
ServerName www.domain2.com
Run Code Online (Sandbox Code Playgroud)

或者:

<VirtualHost *:80>
ServerName www.domain1.com
ServerName www.domain2.com
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

并且两个域都在同一个盒子上工作。在这种情况下,我可以使用 ServerName 或 ServerAlias 吗?

use*_*517 37

服务器名指令是

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

虽然ServerAlias

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

给定一个配置如下的虚拟主机

 ...
 ServerName example.com
 ServerAlias www.example.com foo.example.com *.somewherelse.org
 ...
Run Code Online (Sandbox Code Playgroud)

apache 会响应example.com,www.example.com foo.example.com以及.somewherelse.org此 VirtualHost 中的任何内容

  • 如果我理解正确的话,`ServerName` 会完成 `ServerAlias` 所做的一切,甚至更多。但是应该只有一个`ServerName`。 (6认同)
  • 我完全明白。我的意思是,无论我将它们指定为 ServerName 还是 ServerAlias,主机名似乎都有效。那么这两个指令之间的区别仅仅是语义上的 - 它们做同样的事情吗? (3认同)

Daz*_*zed 7

我通过实验发现的一个主要区别(基于必要性)是,当与通配符子域(例如“*.mycompany.com”和“*.mycompany.net”)一起使用时,通配符必须指定为 ServerAlias 和不是服务器名称。

我没有用非 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>
Run Code Online (Sandbox Code Playgroud)

使用“ServerName *.mycompany.net”时,始终使用第一个虚拟主机。这不仅仅是它正在重写和代理逻辑的证书。

这完全有可能只发生在 SSL 上,因为还有一大堆其他事情在发生——如使用 SNI 的虚拟主机和许多 ServerFault 线程的SSL 中所引用的那样。遵循这些中的所有建议,这是最后一个令人头疼的方面。

我来到这个线程试图了解自己为什么存在差异,并承认我越来越接近但并没有完全理解。

在我的情况下,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
Run Code Online (Sandbox Code Playgroud)

编辑:(为完整性添加带有通配符的 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)
Run Code Online (Sandbox Code Playgroud)

注意:别名行中的“wild”一词,在第一种情况下(使用 ServerAlias)来自 apache,而在第二种情况下(使用 ServerName)没有显示 - 我怀疑这很重要。

此外,如果我从第二个 VirtualHost 中删除“ServerName”,并按照“应该只有一个 ServerName”的建议使用别名,那么请求会有点丢失 - 似乎会自动重定向到“ https://test.mycompany 。 net:8443 " - 因为(在我的情况下)8443 没有在外部显示(nat'd)然后它失败了。是的,我知道对于 443 这可能有效,但可能表明正在发生其他事情。

因此,也许不是问题的答案,而是为其他人在类似设置中苦苦挣扎的一些文档。


Ste*_*ski 5

在处理软件时,拥有一个单一的事实点通​​常很重要。ServerName可以被认为是主机的“真实”规范名称。ServerAlias不是。

ServerName做所有能做的事情ServerAlias,还有更多。作为最佳实践,只设置一个 ServerName,因为应该只有一个“Canonical”。如果ServerName未明确设置,httpd 将自行确定名称。

ServerAlias另一方面只是一个别名,只能在 VirtualHost 上下文中使用。可以有任意数量的这些。

如果站点通过 HTTPS 提供服务,则ServerName 应与包含 Certificate 的名称之一匹配。如果您的证书是为 www.example.org 创建的,但您的配置显示:

ServerName foo.example.org
ServerAlias www.example.org
Run Code Online (Sandbox Code Playgroud)

然后Apache会抱怨以下错误:

12 月 10 日 13:23:45 web1 httpd[1234]:[警告] RSA 服务器证书 CommonName (CN) `www.example.org' 与服务器名称不匹配!?