Web服务器404通常因请求未到达入口文件所致,需检查路由重写、index指令配置、root路径指向、.htaccess生效条件、文件权限及SELinux限制。

确认 Web 服务器是否真的在访问你写的入口文件
很多情况下,404 并不是文件丢了,而是请求压根没走到你预期的 PHP 文件上。比如 Nginx 默认不把 / 映射到 index.php,Apache 可能没启用 mod_rewrite 或没读取 .htaccess。
- 检查浏览器地址栏:你访问的是
http://localhost/还是http://localhost/index.php?如果前者 404、后者正常,说明路由重写失败 - 查看 Web 服务器配置中
index指令是否包含index.php(Nginx 的index index.php index.html;;Apache 的DirectoryIndex index.php index.html) - 用
curl -I http://localhost/看响应头里的Server和状态码,确认是不是 Web 服务器返回的 404,而不是 PHP 报错页面
Nginx 下 Laravel/ThinkPHP 等框架的入口 404
这类框架通常只暴露 public/index.php,但 Nginx 配置若仍指向项目根目录,就会找不到 index.php —— 因为它实际在子目录里。
- 确保
root指向的是public/目录,不是项目根目录:root /var/www/myapp/public;
- 确认
location ~ \.php$块里有fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,否则$fastcgi_script_name可能带多层路径,导致找不到文件 - 如果用了
try_files $uri $uri/ /index.php?$query_string;,要保证/index.php对应的是public/index.php,而不是根目录下的空文件
Apache 中 .htaccess 不生效导致 index.php 无法被隐式调用
常见于本地 XAMPP/MAMP 或手动部署,.htaccess 写了重写规则,但 Apache 根本没加载它。
- 检查
httpd.conf或虚拟主机配置中,对应目录是否设置了AllowOverride All(不是None) - 确认
mod_rewrite已启用:a2enmod rewrite(Ubuntu/Debian),或取消httpd.conf中#LoadModule rewrite_module modules/mod_rewrite.so的注释 -
.htaccess文件必须放在 Web 可访问的根目录(如htdocs/或public/),且文件名不能是htaccess.txt或编码错误
文件权限或 SELinux 导致 PHP 文件存在却报 404
Linux 下即使 ls -l 看到 index.php 存在,Web 服务器用户(如 www-data 或 nginx)也可能无权读取。
立即学习“PHP免费学习笔记(深入)”;
- 运行
ls -l /path/to/index.php,确认属组和权限允许 Web 用户读取(例如-rw-r--r--或至少group可读) - 如果是 CentOS/RHEL,检查 SELinux 是否拦截:
ausearch -m avc -ts recent | grep nginx或临时设为宽容模式测试:setenforce 0 - 注意:某些 Docker 环境中,挂载卷时未加
:z或:Z标签,也会触发 SELinux 权限拒绝
index.php 就在眼前,只要 root 配错一层、AllowOverride 少一个字母、或者 SELinux 多盯了一眼,它就坚定返回 404。











