带有通配符的 Apache 命名虚拟主机

带有通配符的 Apache 命名虚拟主机

我想将 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 了解得比实际更多。感谢您的评论。

相关内容