1. 问题现象
-
访问服务器 IP(
http://192.168.88.120
)返回 404 Not Found。 -
确认
/var/www/html/index.html
文件存在且内容正确(web1
)。 -
检查发现
/etc/httpd/conf.d/
下存在多个虚拟主机配置(如a.org.conf
、b.org.conf
),均定义了不同的DocumentRoot
。
2. 根本原因
-
虚拟主机覆盖默认配置 :
Apache 加载虚拟主机时,若未明确匹配到
ServerName
或ServerAlias
,可能错误使用某个虚拟主机的DocumentRoot
,而非默认的/var/www/html
。 -
缺少默认主机 :
无
<VirtualHost *:80>
默认配置时,Apache 会按文件名顺序选择第一个虚拟主机作为"兜底",导致访问 IP 时返回错误路径。
3. 解决方案
方法 1:添加默认虚拟主机
在 /etc/httpd/conf.d/
下创建优先级最高的配置文件(如 00-default.conf
):
bash
bash
sudo vi /etc/httpd/conf.d/00-default.conf
内容:
bash
<VirtualHost *:80>
DocumentRoot "/var/www/html"
ServerName localhost
ServerAlias 192.168.88.120 # 替换为你的服务器IP
<Directory "/var/www/html">
Require all granted
</Directory>
</VirtualHost>
重启 Apache:
bash
sudo systemctl restart httpd
方法 2:禁用冲突的虚拟主机(测试用)
临时重命名其他虚拟主机配置以排除干扰:
bash
sudo mv /etc/httpd/conf.d/a.org.conf /etc/httpd/conf.d/a.org.conf.bak
sudo mv /etc/httpd/conf.d/b.org.conf /etc/httpd/conf.d/b.org.conf.bak
sudo systemctl restart httpd
测试后恢复:
bash
sudo mv /etc/httpd/conf.d/a.org.conf.bak /etc/httpd/conf.d/a.org.conf
sudo mv /etc/httpd/conf.d/b.org.conf.bak /etc/httpd/conf.d/b.org.conf
方法 3:明确指定虚拟主机的匹配规则
确保其他虚拟主机配置中 仅响应特定域名,避免匹配到 IP 请求:
bash
# 例如:/etc/httpd/conf.d/a.org.conf
<VirtualHost *:80>
DocumentRoot "/var/www/html/a.org"
ServerName a.org # 必须指定域名
ServerAlias www.a.org # 可选别名
</VirtualHost>