本地PHP显示404的首要原因是Web服务未启动或端口未监听,需用netstat检查80/8000端口;其次可能是PHP内置服务器缺少router.php导致静态资源404;再者是XAMPP/WAMP/MAMP的DocumentRoot配置错误或.htaccess重写规则失效。

Apache 或 Nginx 没启动或没监听 80/8000 端口
本地跑 PHP 显示 404,第一反应不是代码问题,而是 Web 服务压根没起来。比如用 php -S 启动了内置服务器,但浏览器却访问了 http://localhost/(默认走 Apache/Nginx),自然 404。
检查方式很简单:
- 运行
netstat -an | grep :80(macOS/Linux)或netstat -ano | findstr :80(Windows),看有没有进程在监听 - 打开浏览器直接访问
http://localhost:8000(如果你用的是php -S localhost:8000) - 确认你没同时开着 XAMPP/WAMP/MAMP 又手动启了内置服务器,端口冲突会导致一个静默失败
PHP 内置服务器没指定路由器文件(router.php)导致静态资源 404
用 php -S 启动时,如果项目里有 CSS/JS 图片等静态文件,不加 router.php,PHP 内置服务器默认只处理 .php 文件,其他一律返回 404。
解决方法是写一个最小化 router.php:
立即学习“PHP免费学习笔记(深入)”;
if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js|ico|xml|txt|pdf|woff2|woff|ttf)$/', $_SERVER["REQUEST_URI"])) {
return false; // 让内置服务器直接返回静态文件
}
include __DIR__ . '/index.php';
然后这样启动:php -S localhost:8000 router.php
注意点:
-
return false是关键,不是exit或die,否则静态文件读不到 - 路径匹配要覆盖你实际用的后缀,比如用了
.webp就得加上 - 如果
index.php不在当前目录,__DIR__要对应调整
DocumentRoot 配置错误(XAMPP/WAMP/MAMP 场景)
用集成环境却访问不到自己写的 PHP 文件,大概率是 DocumentRoot 指向了默认目录(如 C:/xampp/htdocs),而你的项目放在了桌面或其它位置。
改法分两步:
- 找到对应配置文件:XAMPP 是
apache/conf/httpd.conf,WAMP 是菜单里「Apache → httpd.conf」,MAMP 是应用内「Preferences → Web Server」 - 搜
DocumentRoot和,把两个路径都改成你项目所在目录,例如"D:/myproject" - 改完必须重启 Apache,否则不生效;重启后留意控制台有没有报错,比如权限拒绝或路径不存在
常见坑: 路径末尾不能漏掉斜杠,Windows 下路径要用正斜杠 / 或双反斜杠 \\,单反斜杠会解析失败。
.htaccess 重写规则干扰或缺失(尤其 Laravel / ThinkPHP 等框架)
框架项目本地 404,十有八九是 URL 重写没开或规则没生效。比如 Laravel 的 public/index.php 能直接访问,但 /users 就 404,说明 rewrite 模块没启用或 .htaccess 被忽略。
Apache 下检查项:
- 确认
mod_rewrite已启用:在httpd.conf中取消注释LoadModule rewrite_module modules/mod_rewrite.so - 确保对应
块里有AllowOverride All(不是None) - 检查项目根目录(通常是
public/)下是否有有效的.htaccess文件,内容是否被意外清空
Nginx 用户则要手动配 try_files,例如 Laravel 的典型配置:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
少这一行,所有非 PHP 脚本路径都会 404。
本地 404 表面是路径问题,实际常卡在服务层、路由层、重写层三层之间。最省时间的做法:先 curl 看响应头和状态码,再查 Web 服务日志(Apache 的 error.log,PHP 内置服务器的终端输出),比瞎改代码快得多。











