
PHP应用返回404错误,通常并非代码逻辑问题,而是Web服务器(如Apache)未将请求路由至目标PHP文件——尤其当文件位于public目录之外(如src/)时,因安全限制默认禁止外部直接访问,必须通过正确路径配置或入口统一转发。
php应用返回404错误,通常并非代码逻辑问题,而是web服务器(如apache)未将请求路由至目标php文件——尤其当文件位于public目录之外(如src/)时,因安全限制默认禁止外部直接访问,必须通过正确路径配置或入口统一转发。
在现代PHP项目开发中,采用“前端控制器”(Front Controller)模式是标准实践:所有HTTP请求应统一经由public/index.php入口处理,而非允许客户端直接访问src/、database/等敏感目录下的PHP脚本。你当前表单中设置 action="src/create.php" 导致404,根本原因在于 Apache默认拒绝解析位于DocumentRoot之外(或未显式暴露)目录中的PHP文件——这既是安全机制,也是Web服务器的默认行为。
✅ 正确做法:统一入口 + 路由分发(推荐)
将表单提交目标改为public/index.php,并在其中完成请求分发:
<!-- public/index.php 中的表单 -->
然后在 public/index.php 顶部添加简易路由逻辑:
<?php // public/index.php —— 前端控制器入口
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
switch ($_POST['action']) {
case 'create':
// 安全引入:使用绝对路径,避免跨目录遍历
$baseDir = dirname(__DIR__); // 指向项目根目录(含 src/、database/)
require_once $baseDir . '/src/create.php';
exit;
default:
http_response_code(400);
die('Invalid action');
}
}
// 正常渲染页面...
?>
同时,更新 src/create.php,移除对 $_POST["submit"] 的依赖(因其已由入口统一接收),并确保数据库连接路径正确:
<?php // src/create.php —— 仅专注业务逻辑,不处理HTTP重定向细节
require_once __DIR__ . '/../database/conn_db.php';
// 验证数据(建议使用filter_var等更健壮方式)
$title = $_POST['title'] ?? '';
$desc = $_POST['description'] ?? '';
if (empty($title) || empty($desc)) {
$error = urlencode(empty($title) ? 'Invalid title' : 'Invalid description');
header("Location: /index.php?create=error&msg={$error}");
exit;
}
// 使用预处理语句防止SQL注入(强烈建议替代 mysqli_real_escape_string)
$stmt = $conn->prepare("INSERT INTO todolist.tasks (title, description) VALUES (?, ?)");
$stmt->bind_param("ss", $title, $desc);
$stmt->execute();
header("Location: /index.php?create=success");
exit;
⚠️ 为什么 action="src/create.php" 在Xdebug Live Server能工作?
Xdebug Live Server(如VS Code插件)本质是轻量级PHP内置服务器(php -S),它默认递归服务当前目录下所有PHP文件,且无DocumentRoot隔离概念。而Apache 2.4严格遵循DocumentRoot配置——若src/不在该目录内(例如DocumentRoot "C:/xampp/htdocs/todo/public"),则/src/create.php路径根本不可达,直接返回404。
? 其他不推荐但可临时验证的方案(仅用于调试)
-
修改Apache配置暴露src目录(❌生产环境严禁)
在虚拟主机配置中添加:<directory> Require all granted php_flag engine on </directory>并重启Apache。⚠️此举破坏最小权限原则,易导致源码泄露。
-
使用.htaccess重写(仅限Apache + AllowOverride启用)
在public/.htaccess中添加(不推荐,增加维护复杂度):RewriteRule ^src/(.*)$ ../src/$1 [L]
✅ 最佳实践总结
| 项目 | 推荐方案 |
|---|---|
| 目录结构 | 保持 public/ 为唯一Web可访问目录;src/、database/ 等置于其上级,不可被URL直接访问 |
| 表单提交 |
action="index.php" 或 action="/index.php"(根相对路径),配合隐藏字段标识动作 |
| 安全性 | 禁止任何.php文件暴露在public/外;数据库凭证、配置文件绝不置于Web根下 |
| 本地开发 | 使用php -S localhost:8000 router.php并配置router.php统一处理静态资源与PHP路由,模拟生产环境 |
? 提示:若你使用Laravel、Symfony等框架,它们已内置此机制——所有请求均由
public/index.php引导,src/目录仅作代码组织,完全屏蔽于Web之外。你的手动实现,正是在复刻这一核心设计思想。
遵循上述方案,即可彻底解决“访问src/目录返回404”的问题,同时显著提升应用安全性与可维护性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











