我不太清楚 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 中的任何内容
我通过实验发现的一个主要区别(基于必要性)是,当与通配符子域(例如“*.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 这可能有效,但可能表明正在发生其他事情。
因此,也许不是问题的答案,而是为其他人在类似设置中苦苦挣扎的一些文档。
在处理软件时,拥有一个单一的事实点通常很重要。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' 与服务器名称不匹配!?
| 归档时间: |
|
| 查看次数: |
82028 次 |
| 最近记录: |