
php 内置开发服务器(php -s)返回 404 的根本原因,是请求的文件路径未落在当前工作目录下——该命令仅提供静态路由映射,不支持自动目录遍历或项目根目录推断。
PHP 自带的内置 Web 服务器(php -S)是一个轻量级、无配置的开发工具,适用于快速测试 PHP 脚本,但它对文件路径极为严格:它只从你执行命令时所在的当前工作目录(current working directory)中查找并响应请求。这意味着,无论你的项目结构多么复杂(如 Laravel 的 public/ 入口、Vue 的 dist/ 目录或自定义的 src/),你都必须确保 php -S 命令在实际可访问资源所在的目录中运行。
例如,假设你的项目结构如下:
/project
├── composer.json
├── app/
├── public/ ← 实际 Web 入口(含 index.php)
│ ├── index.php
│ └── assets/
└── src/ ← 另一个可能存放脚本的目录
└── demo.php-
❌ 错误做法:在 /project 根目录下执行
cd /project php -S localhost:8888
此时访问 http://localhost:8888/index.php 会 404 —— 因为 index.php 并不在 /project 下,而是在 /project/public/ 中。
立即学习“PHP免费学习笔记(深入)”;
-
✅ 正确做法:切换至 public/ 目录再启动
cd /project/public php -S localhost:8888
此时 index.php 位于当前目录,请求可被正常响应。
? 进阶提示:指定路由器脚本(推荐 Laravel 等框架使用) 对于需要 URL 重写(如 Laravel 的 index.php 统一入口)的项目,应配合路由器脚本启动:cd /project/public php -S localhost:8888 router.php其中 router.php 示例(保存在 public/ 下):
⚠️ 常见误区与注意事项:
- 删除旧项目(如 Laravel)后出现 404,往往是因为你习惯性在原项目根目录运行命令,但新项目结构已变(如入口从根目录移到 public/),却未同步调整启动路径;
- php -S 不读取 .htaccess、nginx.conf 或 php.ini 中的重写规则,一切路由逻辑需由 PHP 脚本显式控制;
- 浏览器缓存或预加载可能导致“看似相同 URL 却行为异常”,建议测试时使用无痕窗口或清除缓存;
- Windows 用户注意路径分隔符兼容性,但 cd 切换目录逻辑与 Unix 一致,重点仍是物理工作目录匹配资源位置。
总结:解决 php -S 的 404 问题,核心就一句话——让终端当前路径(pwd / cd 结果)与浏览器所请求的 PHP 文件所在路径完全一致。养成执行前先 ls -l index.php 确认文件存在的习惯,可避免绝大多数路径类 404。











