我想将www.example.com映射到特定的虚拟主机,然后我希望example.com的所有其他子域都转到另一个虚拟主机。
为此,我创build了这些主机:
<VirtualHost *:80> ServerName www.example.com </VirtualHost> <VirtualHost *:80> ServerName example.com ServerAlias *.example.com </VirtualHost>
现在select哪个主机服务似乎是随机的。 如果我重新启动Apache有时我会得到一个主机和其他时间。
我究竟做错了什么?
谢谢!
更新:如果我在这个configuration上运行apache2ctl -S,我得到这个输出:
VirtualHostconfiguration:
通配符NameVirtualHosts和_default_服务器:
*:80是NameVirtualHost
默认服务器www.example.com(/ etc / apache2 / sites-enabled / dev:3)
端口80 namevhost www.example.com(/ etc / apache2 / sites-enabled / dev:3)
端口80 namevhost example.com(/ etc / apache2 / sites-enabled / dev:22)
经过大量的挖掘,我决定禁用我运行的低级单声道应用程序,并注意它开始从正确的站点提供文件。 他们确实需要按顺序input:
<VirtualHost *:80> ServerName example.com </VirtualHost> <VirtualHost *:80> ServerName www.example.com </VirtualHost>
如向导build议的那样。 为了让我的单声道应用程序正常工作,我在每个虚拟主机中使用了“MonoAutoApplication enabled”。 不过,我不知道这是最好的select,因为它说你不应该使用自动托pipe的asp.net mvc应用程序(这是我使用的)。 到目前为止,我看不出有什么不好的地方。
更新:*是有效的语法,但不是必需的。 你可以在这里find更多。
这将工作。
<VirtualHost *:80> ServerName example.com </VirtualHost> <VirtualHost *:80> ServerName www.example.com </VirtualHost>
第一个指令将匹配其他地方没有明确定义的所有内容。
代码应该可能是:
<VirtualHost _default_:80> ServerName example.com </VirtualHost> <VirtualHost *:80> ServerName www.example.com </VirtualHost>
请参阅: http : //httpd.apache.org/docs/2.2/vhosts/examples.html#default
这明确定义“example.com”虚拟主机作为主机使用,如果没有其他的匹配。
您确定www.example.com虚拟主机出现在configuration文件中的其他虚拟主机之前吗? Apache应该按顺序通过虚拟主机,然后select第一个与ServerName或ServerAlias匹配的Host HTTP头中发送的值。 看起来很奇怪的是,它会随机挑选一个虚拟主机,有时会select另一个虚拟主机。
这可能有助于编辑您的问题,包括输出
apache2ctl -S
其中显示了Apache所看到的定义的虚拟主机。
您需要将DocumentRoot添加到configuration中。 它应该是这样的:
# Ensure that Apache listens on port 80 Listen 80 # Listen for virtual host requests on all IP addresses NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /www/example1 ServerName www.example1.com # Other directives here </VirtualHost> <VirtualHost *:80> DocumentRoot /www/example2 ServerName www.example2.org # Other directives here </VirtualHost>
编辑:似乎我认为我比我更了解Apache。 感谢您的意见。