一个IP地址怎样配置多个Apache子域名?

28

可能已经有人问过这个问题,但我找不到直接的答案,或者我找到的答案无效。

我有一个域名mydomain.com,解析到一个IP地址;假设为8.8.8.8。DNS设置还使用A记录将两个子域指向该IP地址。它们是dev.mydomain.comstaging.mydomain.com。两个子域都有一个指向8.8.8.8的A记录。

在服务器(8.8.8.8)上,我有两个虚拟主机文件。它们如下所示:

staging.mydomain.com.conf

<VirtualHost *:80>
    ServerName  staging.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/staging/
</VirtualHost>

而且...

dev.mydomain.com.conf

<VirtualHost *:80>
    ServerName  dev.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/dev/
</VirtualHost>

问题是:

无论我访问http://staging.mydomain.com还是http://dev.mydomain.com,我总是会落在staging.mydomain.com上(Apache提供这些文件)。

我已经重新启动了Apache,甚至是服务器。如果我更改.conf文件的顺序,以便dev排在第一位,我总是会看到它。任何建议都将不胜感激。谢谢!


更新

我又回到了这个问题!如果您知道您的语法是正确的,那么您可能有一个错误的符号链接。删除它并重新创建,在其中重新启动apache。我刚刚做到了这一点,解决了数小时的头皮屑。在CentOS上,您可以使用httpd -S检查可用的虚拟主机。

更新2

我也发现当虚拟主机的Apache日志文件不存在或不可写时,存在此问题。


4
我投票支持重新开放这个问题,因为这个问题和答案都很有帮助。另外,在StackOverflow上关于Apache的问题并不属于禁止讨论的范围,而ServerFault只适用于专业设置。 - Sumurai8
1个回答

33
听起来你需要在你的配置中添加 NameVirtualHost 指令。
NameVirtualHost         *:80

在某些情况下,Apache 可能无法正确处理 *:80 虚拟主机。在这种情况下,您应该直接将虚拟主机映射到特定的 IP 地址。
NameVirtualHost         8.8.8.8:80

<VirtualHost 8.8.8.8:80>
    ServerName  staging.mydomain.com
    ServerAlias stage.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/staging/
</VirtualHost>

<VirtualHost 8.8.8.8:80>
    ServerName  dev.mydomain.com
    ServerAlias development.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/dev/
</VirtualHost>

你也可以运行 apachectl -t -D DUMP_VHOSTS 命令来查看 Apache 如何解析 VirtualHost 配置。
更新:正如评论中提到的那样,通常你可以只使用 NameVirtualHost *:80。因此,大多数情况下,你可以按照以下方式配置虚拟主机。
NameVirtualHost         *:80

<VirtualHost *:80>
    ServerName  staging.mydomain.com
    ServerAlias stage.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/staging/
</VirtualHost>

<VirtualHost *:80>
    ServerName  dev.mydomain.com
    ServerAlias development.mydomain.com
    DocumentRoot /var/www/html/mydomain.com/dev/
</VirtualHost>

谢谢Ketola,我在两个.conf文件和httpd.conf文件中都尝试过,但是没有成功,虽然顺序改变了!“apachectl -t -D DUMP_VHOSTS”非常有用,它显示Apache将开发服务器定义为默认服务器并首先加载它。 - Jongosi
非常奇怪。我能想到的唯一其他原因是某处有错别字,但这种可能性相当小。你有代理或其他任何可能会干扰请求中的“Host:”头的东西吗?下一步将是在Apache中设置“LogLevel debug”,和/或在服务器上执行“telnet localhost 80”并直接请求文档。 - Ketola
3
我遇到了类似的问题...apachectl -t -D DUMP_VHOSTS命令给出了答案:[Mon May 20 23:51:08 2013] [warn] _default_ VirtualHost overlap on port 80, the first has precedence。 添加NameVirtualHost *:80解决了这个问题。 - jyore
对于像我这样的谷歌员工使用以下内容: <VirtualHost *:80> ServerName www.domain.tld ServerAlias domain.tld *.domain.tld DocumentRoot /www/domain </VirtualHost> - Alex Khimich
我尝试了NameVirtualHost,但它已经被弃用了。而且它对我也没有起作用。 - Bobort
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接