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 只允许访问本地网络