Apache虚拟主机返回404主因是请求未匹配预期目录,需依次排查:DocumentRoot路径是否存在及权限是否正确、虚拟主机是否被准确匹配(如缺ServerName导致兜底错配)、mod_rewrite是否启用且AllowOverride All设置到位、SELinux等安全模块是否拦截。

Apache 虚拟主机返回 404,通常不是页面真丢了,而是请求根本没落到你预期的目录——得先确认 Apache “找文件时看的是哪块地”。核心问题集中在路径、匹配、权限和模块四点上,挨个查比重启更有效。
检查 DocumentRoot 是否指向真实存在的目录
虚拟主机配置里写的 DocumentRoot 必须是物理存在的路径,且 Apache 进程(如 www-data 或 apache 用户)有读取权限。
- 用命令确认路径存在:
ls -ld /var/www/example.com - 检查文件是否真在该目录下:
ls /var/www/example.com/index.html - 验证权限:目录需至少有
rx权限,文件需有r权限,常见修复:sudo chown -R apache:apache /var/www/example.com和sudo chmod -R 755 /var/www/example.com
确认虚拟主机是否被正确匹配
访问 IP 地址却出现 404?很可能是 Apache 没找到匹配的 ServerName,于是用了第一个加载的虚拟主机(或默认主机),而它的 DocumentRoot 并非你的网站目录。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保每个虚拟主机都明确声明
ServerName(如example.com)和可选的ServerAlias(如www.example.com) - 为直接访问 IP 添加兜底配置:在
/etc/httpd/conf.d/下新建00-default.conf,内容包含<VirtualHost *:80>块,并设DocumentRoot "/var/www/html"和ServerName localhost - 配置文件按字母顺序加载,
00-开头能确保它优先生效
验证 .htaccess 和 URL 重写是否生效
WordPress、Laravel 等框架依赖 .htaccess 实现友好链接,若重写失效,伪路径(如 /post/123)就会 404。
- 确认
mod_rewrite已启用:httpd -M | grep rewrite(CentOS/RHEL)或a2enmod rewrite(Debian/Ubuntu) - 在对应虚拟主机的
<Directory>块中设置:AllowOverride All(不能是None)和Options FollowSymLinks - 确保 .htaccess 文件位于 DocumentRoot 根目录,且内容语法正确(例如 WordPress 的标准规则)
排除 SELinux 或安全模块拦截
在 CentOS/RHEL 系统上,SELinux 可能静默阻止 Apache 访问目录,日志只显示 “File does not exist”,实际是被内核策略拦住。
- 临时测试是否为 SELinux 导致:
sudo setenforce 0,再访问;若 404 消失,就是它 - 永久修复:给目录打上正确上下文,例如:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?",然后sudo restorecon -Rv /var/www/example.com - 也可检查审计日志:
sudo ausearch -m avc -ts recent | audit2why

















