我使用 Apache 将一些站点配置为 VirtualHosts,这些站点已经运行良好一段时间了。我最近将服务器的主机名更改为正在提供服务的域名之一,并将其添加到指向服务器外部 IP 地址的 /etc/hosts 中。
自从我这样做之后,从我的笔记本电脑访问域名就会转到 Apache 的默认“它起作用了!”页面。如果我从 /etc/apache2/sites-enabled/ 中删除 000-default,它会显示正确的站点。尝试访问带有“www.”前缀的站点,无论 000-default 是否在 sites-enabled 中,我都会转到正确的站点。
基于所有这些,我猜测默认配置会提供默认页面,因为我已配置了主机名或 /etc/hosts(或两者),但我不知道如何在保留这些设置的情况下禁用它。欢迎提出任何建议!
编辑-我当前的 VirtualHost 配置如下所示:
<VirtualHost *:80>
ServerName domain.com
ServerAlias www.domain.com
ServerAdmin [email protected]
DocumentRoot /srv/www/domain
ErrorLog /srv/www/domain/logs/error.log
CustomLog /srv/www/domain/logs/access.log combined
</VirtualHost>
总结一下:我设置了多个 VirtualHost,但只有这个无法正常工作。我可以访问http://www.domain.com很好,但是http://域名.com带我进入 Apache 的默认“它有效!”页面。如果我禁用 000-default 配置,它会显示正确的页面。只有在我将服务器的主机名设置为 domain.com 并在 /etc/hosts 中添加一行将 domain.com 指向服务器的外部 IP 地址后,才会出现这种情况。如果可能的话,我想保留这些内容。
编辑:我运行apache2ctl -S
后,/usr/sbin/apache2 -S
系统提示“apache2:错误的用户名 ${APACHE_RUN_USER}”。输出如下:
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server domain.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost domain.com (/etc/apache2/sites-enabled/000-default:1)
port 80 namevhost other.com (/etc/apache2/sites-enabled/other:1)
port 80 namevhost another.com (/etc/apache2/sites-enabled/another:1)
port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain:1)
Syntax OK
答案1
前几天丢了这个问题。
如果您有一个没有 ServerName 组件的 <VirtualHost> 容器,它将使用默认主机名。由于 000-default 可能没有 ServerName 组件,并且是按字母顺序第一个包含的,因此它回答 hostname.com 并且不允许您明确声明的主机名工作。
答案2
您在某处有 NameVirtualHost *:80 指令吗?
尝试:
/usr/sbin/apache2 -S
这将告诉您 Apache 如何解析配置文件。您的配置是否具有实际 IP 或所有配置都带有 *?您是否缺少 :80?Apache 不喜欢混合这些。
您的默认 ServerName 是否为 domain.com 或 ServerAlias 是否为 domain.com?
答案3
检查 VirtualHost 指令中的 ServerName 和 ServerAlias:
<VirtualHost *:80>
ServerName domain
ServerAlias www.domain.com
ServerAlias *.domain.com
</VirtualHost>
读:http://httpd.apache.org/docs/2.2/mod/core.html#serveralias,http://httpd.apache.org/docs/2.2/vhosts/
答案4
我遇到了类似的问题,我通过在主 httpd.conf 文件中明确设置 ServerName 来修复它,而不是让 apache 自动找出它。我假设 apache 决定的内容与我的 vhost(稍后定义)相同,因此默认的“获胜”,覆盖了 vhost 设置。
我只是将 httpd.conf ServerName 设置为该机器拥有的主机名,我永远不会为其提供网页。