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吗?

    ServerName指令是

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

    虽然ServerAlias是

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

    给定一个像configuration的虚拟主机

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

    Apache会响应example.comwww.example.com foo.example.com和任何在.somewherelse.org这个虚拟主机

    通过实验发现的一个关键区别是(根据需要),当与通配符子域(例如“* .mycompany.com”和“* .mycompany.net”)一起使用时,必须将通配符指定为ServerAlias,不是ServerName。

    我没有尝试过这与非SSL,但与SSL是这样的(对我来说)。 我决定了以下configuration:

     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和许多ServerFault线程的虚拟主机中引用SSL一样 。 在遵循这些build议之后,这是最后一个挠头方面。

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

    在我的情况下,ServerName似乎做得less一些(不是在虚拟主机search),而不是更多。

    根据Iain的build议运行“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”,那么请求会有点丢失 – 似乎会自动redirect到“ https://test.mycompany”。净:8443 “ – 因为(在我的情况下)8443不显示外部(nat'd),那么它失败。 是的,我知道这可能工作,但可能显示其他事情正在进行。

    所以,也许不是对这个问题的回答,而是为其他人为类似的设置而苦苦挣扎的一些文档。

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

    ServerName完成ServerAlias所做的一切,还有一点。 作为一个最佳实践,只设置一个ServerName,因为应该只有一个“Canonical”任何东西。 如果ServerName未明确设置,httpd将自行确定一个名称。

    另一方面, ServerAlias只是一个别名,只能在VirtualHost上下文中使用。 可以有尽可能多的这些你想要的。

    如果通过HTTPS提供站点,则ServerName应该与包含该证书的其中一个名称匹配 。 如果您的证书是为www.example.org创build的,但您的configuration说:

     ServerName foo.example.org ServerAlias www.example.org 

    然后Apache会抱怨以下错误:

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

    ServerName是apache在URL中使用自己的名字时使用的名称,例如目录列表的redirect。