我想将 www.example.com 映射到特定的虚拟主机,然后希望 example.com 的所有其他子域名都转到另一个虚拟主机。
为此我创建了以下主机:
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
</VirtualHost>
现在选择哪个主机提供服务似乎相当随机。如果我重新启动 Apache,有时我会得到一个主机,有时又得到另一个主机。
我究竟做错了什么?
谢谢!
更新:如果我在此配置上运行 apache2ctl -S,我会得到以下输出:
VirtualHost 配置: 通配符 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)
经过一番研究,我决定禁用正在运行的 Mono 应用程序,然后它就开始从正确的站点提供文件了。它们确实需要按以下顺序输入:
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
按照 Wizard 的建议。为了让我的 mono 应用程序正常工作,我在每个虚拟主机中都使用了“MonoAutoApplication enabled”。但是我不确定这是最好的选择,因为单声道 它说你不应该对 asp.net mvc 应用程序使用自动托管(我正在使用)。但到目前为止,我还没有发现任何缺点。
答案1
更新:* 是有效语法,但不是必需的。您可以了解更多信息这里。
但这会起作用。
<VirtualHost *:80>
ServerName example.com
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
</VirtualHost>
第一个指令将匹配其他地方未明确定义的所有内容。
答案2
代码大概应该是:
<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”虚拟主机作为在没有其他匹配项时使用的主机。
答案3
您确定www.example.com
配置文件中的虚拟主机出现在其他虚拟主机之前吗?Apache 应该按顺序浏览虚拟主机,并选择第一个带有ServerName
或与 HTTP 标头ServerAlias
中发送的值匹配的虚拟Host
主机。它有时会随机选择一个虚拟主机,有时会随机选择一个虚拟主机,这似乎很奇怪。
编辑您的问题以包含以下输出可能会有所帮助
apache2ctl -S
它显示 Apache 所看到的已定义的虚拟主机。
答案4
您需要将 DocumentRoot 添加到配置中。它应该是这样的:
# 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 了解得比实际更多。感谢您的评论。