Apache 2.4 VirtualHost ServerName 被忽略

Posted

技术标签:

【中文标题】Apache 2.4 VirtualHost ServerName 被忽略【英文标题】:Apache 2.4 VirtualHost ServerName is ignored 【发布时间】:2016-10-02 12:48:04 【问题描述】:

在 Amazon EC2 上,我有以下配置:

<VirtualHost *:80>
    ServerName   a.example.com
    ServerRoot   /var/www/a.example.com
    DocumentRoot html
</VirtualHost>

<VirtualHost *:80>
    ServerName   b.example.com
    ServerRoot   /var/www/b.example.com
    DocumentRoot html
</VirtualHost>

<VirtualHost *:80>
    ServerName   c.example.com
    ServerRoot   /var/www/c.example.com
    DocumentRoot html
</VirtualHost>

问题是,尽管上述配置正确,对 3 个域名中任何一个的所有请求都被定向,就好像请求转到 c.example.com - 就好像 ServerName 值被忽略了一样。

有人看到这里有问题吗?

【问题讨论】:

【参考方案1】:

ServerRoot 只允许在 server config Context 中,而不是在 VirtualHost

如果你尝试在其他地方使用它,你会得到一个配置错误, 将阻止服务器处理该请求 上下文正确,否则将阻止服务器运行 - 即,服务器甚至不会启动。

【讨论】:

太棒了。没有警告,没有错误,文件没有解析错误,甚至 httpd -S 显示正确的 VirtualHost 路由......只是非常糟糕的错误报告。 确实有点奇怪。事实上,即使在 VirtualHost 中,该指令似乎也能正常工作,只是只应用了最后一个(甚至没有多个 ServerRoot 指令,因为它决定了许多其他相对路径的位置)【参考方案2】:

我发现的问题是我构建的 Apache2:

Server version: Apache/2.4.18 (Amazon)
Server built:   Mar  7 2016 22:32:11

没有正确处理DocumentRoot 参数。

在 DocumentRoot 配置定义 here,它说

如果目录路径不是绝对的,那么它被假定为 相对于 ServerRoot。

好吧,这显然被忽略了,因为如果我将 DocumentRoot 值更改如下:

<VirtualHost *:80>
    ServerName   b.example.com
    ServerRoot   /var/www/b.example.com
    DocumentRoot html
</VirtualHost>

到这里:

<VirtualHost *:80>
    ServerName   b.example.com
    ServerRoot   /var/www/b.example.com
    DocumentRoot /var/www/b.example.com/html   #<-- updated
</VirtualHost>

然后配置工作。我还没有测试过这是否是核心 Apache 构建的问题,或者是否是亚马逊版本的问题,无论哪种方式,我希望这个答案对某人有所帮助。

【讨论】:

以上是关于Apache 2.4 VirtualHost ServerName 被忽略的主要内容,如果未能解决你的问题,请参考以下文章

后端多个apache 2.4 如何同步设置virtualhost

Apache 2.4 VirtualHost Ubuntu 只允许访问本地网络

限制对 Apache 2.4 虚拟主机 (WAMP) 的访问

apache 2.4 配置loadbalance

Apache httpd-2.4 相关文件

在 apache 2.4 版中配置子域。*