Apache 2.4 在同一端口上的多个虚拟主机

Posted

技术标签:

【中文标题】Apache 2.4 在同一端口上的多个虚拟主机【英文标题】:Several virtual hosts on the same port with Apache 2.4 【发布时间】:2016-05-02 07:32:48 【问题描述】:

我正在尝试用 Apache 2.4 中的虚拟主机做一些简单的事情(使用 Wampserver 2.5)

我希望能够拥有多个虚拟主机并通过以下方式访问它们:

www.project1.dev www.project2.dev

所以我通过阅读official guide 在httpd.conf 中进行了以下配置:

NameVirtualHost \*:80

#
# Project 1
#

<VirtualHost *:80>
    DocumentRoot "C:/wamp/www/myProject1/"
    ServerName www.project1.dev
    ErrorLog "logs/project1-error_log "
    CustomLog "logs/project1-access_log" common
    <Directory "C:/wamp/www/myProject1/">
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

#
# Project 2
#

<VirtualHost *:80>
    DocumentRoot "C:/wamp/www/myProject2/"
    ServerName www.project2.dev
    ErrorLog "logs/project2-error_log "
    CustomLog "logs/project2-access_log" common
    <Directory "C:/wamp/www/myProject2/">
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

我还将它们添加到我的 hosts 文件中

127.0.0.1 http://project1.dev
127.0.0.1 http://project2.dev

但是当我在重启 wamp 服务后进行测试时,http://project1.dev 和 http://project2.dev 都指向 C:/wamp/www/myProject1/

project2.dev 相关的第二条路径C:/wamp/www/myProject2/ 似乎被忽略了。

我错过了什么吗?

谢谢。

【问题讨论】:

*:80。不,您需要指定 主机 每次发布​​新版本的 Apache 时,您如何处理虚拟主机都会不断变化。我预计它会在一周左右再次改变。您需要阅读当前版本的文档并严格遵守。您不能使用较旧或较新的文档,因为它的格式不正确。 \*:80?尝试消除\。您在NVH 指令中添加的内容必须与&lt;VirtualHost&gt; 行完全匹配... @kainaw 我有 Apache 2.4.9,我读过的文档是我猜的好文档:httpd.apache.org/docs/2.4/vhosts/name-based.html @MarcB 根据文档,\* 是指定所有 IP 地址的通配符。 【参考方案1】:

您尚未在任何地方定义http://project2.dev - 只是http://www.project2.dev。因此 Apache 默认回到第一个配置,因为它找不到匹配项。

将以下配置添加到第一个虚拟主机:

ServerAlias project1.dev

这与第二个类似:

ServerAlias project2.dev

然后重新启动 Apache。

【讨论】:

【参考方案2】:

简单的答案是,从 Apache 2.4 开始,NameVirtualHost *:80 语法不再需要或允许!它会引发错误并导致 Apache 无法启动。 apache error log查找错误会出现。

哦,NameVirtualHost \*:80 从来都不是对的!

所以只需完全删除 NameVirtualHost \*:80 行。

一旦您定义了虚拟主机,httpd.conf 中的 localhost 就会被忽略,因此您也应该在 httpd-vhost.conf 中定义它,否则其他 2 个 VH def 看起来不错,除了 ServerName 和缺少的 @ 987654330@ 和失踪的Options

<VirtualHost *:80>
    DocumentRoot "C:/wamp/www/"
    ServerName localhost
    <Directory "C:/wamp/www/">
      Options Indexes FollowSymLinks MultiViews
      AllowOverride all
      Require local
    </Directory>
</VirtualHost>


#
# Project 1
#

<VirtualHost *:80>
    DocumentRoot "C:/wamp/www/myProject1/"
    ServerName project1.dev
    ServerAlias www.project1.dev
    ErrorLog "logs/project1-error_log "
    CustomLog "logs/project1-access_log" common
    <Directory "C:/wamp/www/myProject1/">
      AllowOverride all
      Options Indexes FollowSymLinks MultiViews
      Require all granted
    </Directory>
</VirtualHost>

#
# Project 2
#

<VirtualHost *:80>
    DocumentRoot "C:/wamp/www/myProject2/"
    ServerName project2.dev
    ErrorLog "logs/project2-error_log "
    CustomLog "logs/project2-access_log" common
    <Directory "C:/wamp/www/myProject2/">
      AllowOverride all
      Options Indexes FollowSymLinks MultiViews
      Require all granted
    </Directory>
</VirtualHost>

引用:但是当我在重启 wamp 服务后进行测试时,http://project1.dev 和 http://project2.dev 都指向 C:/wamp/www/myProject1/

如果您的 VH 定义中有错误,Apache 将默认使用 httpd-vhosts.conf 中第一个正确定义的 VH,所以这可能会发生

至于您的HOSTS 文件,它应该包含对 IPV4 和 IPV6 堆栈的引用,尤其是当 windows 似乎越来越多地使用 IPV6 堆栈时,毕竟我们最终要移动到的地方,它不应该包含 @ 987654334@ 所以应该是这样的:-

#IPV4 stack ip addresses
127.0.0.1 localhost
127.0.0.1 project1.dev
127.0.0.1 project2.dev

#IPV6 stack ip addresses
::1 localhost
::1 project1.dev
::1 project2.dev

更改 HOSTS 文件后,您要么需要重新启动,要么在使用“以管理员身份运行”启动的命令窗口中执行以下操作

net stop dnscache
net start dnscache

【讨论】:

以上是关于Apache 2.4 在同一端口上的多个虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

Apache虚拟主机配置

43.apache虚拟主机的使用

Apache 创建虚拟主机目录和设置默认访问页面

Apache服务器在80端口配置多域名虚拟主机的方法

如何设置虚拟主机以将同一 IP 上的两个端口指向不同的服务器名称?

LAMP-Apache虚拟主机