
php 内置开发服务器返回“404 not found”通常是因为请求路径与当前工作目录下的文件结构不匹配,而非端口或配置问题;关键在于确保 `php -s` 启动时所在目录包含被请求的脚本文件。
PHP 自带的内置 Web 服务器(php -S)是轻量级开发调试利器,但其路由机制极为简单:它仅在启动命令所处的当前工作目录(及子目录)中查找请求的文件,不支持跨目录自动解析或项目根目录映射。这意味着,如果你在 /project 目录下执行:
cd /project php -S localhost:8888
那么访问 http://localhost:8888/index.php 时,PHP 会严格查找 /project/index.php —— 若该文件实际位于 /project/src/index.php,则必然返回 404。
✅ 正确做法是:将终端工作目录切换至实际 Web 入口文件所在路径再启动服务。例如:
# 错误:在项目根目录启动,但入口在 src/ 下 cd /project php -S localhost:8888 # → 请求 /index.php 失败(文件不在 /project/) # 正确:进入 src 目录后启动 cd /project/src php -S localhost:8888 # → 请求 /index.php 成功(文件在当前目录)
? 进阶技巧:你还可以显式指定路由器脚本(router script),实现更灵活的请求分发(如 Laravel 的 server.php):
立即学习“PHP免费学习笔记(深入)”;
php -S localhost:8888 router.php
其中 router.php 需返回 true 表示由 PHP 自动处理静态文件,或 false/readfile() 手动响应。Laravel 项目删除后出现 404,往往是因为你误在旧项目根目录(含 server.php)启动,而新项目未提供对应路由逻辑或入口文件缺失。
⚠️ 注意事项:
- php -S 不读取 .htaccess、php.ini 或 Apache/Nginx 配置,一切行为由当前目录结构和可选路由脚本决定;
- 确保目标文件具有可读权限,且无拼写错误(如 Index.php ≠ index.php,Linux 区分大小写);
- 浏览器缓存可能导致假性 404,建议使用无痕模式或 curl -I http://localhost:8888/index.php 验证;
- 生产环境严禁使用 php -S,它仅为开发用途设计。
总结:404 不是 bug,而是 PHP 内置服务器“所见即所得”设计哲学的体现。启动位置即文档根目录(Document Root)——找准入口文件所在路径,cd 进去再运行 php -S,问题自然迎刃而解。











