我不太清楚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.com
, www.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。