
PHP项目出现“访问src目录返回404”本质是Web服务器(如Apache/Nginx)默认禁止对外暴露非Web根目录的敏感路径,src/、database/等目录不应被浏览器直接请求——正确做法是将Web根目录严格限定在public/,并通过服务端包含(include_once)安全调用逻辑文件。
php项目出现“访问src目录返回404”本质是web服务器(如apache/nginx)默认禁止对外暴露非web根目录的敏感路径,`src/`、`database/`等目录不应被浏览器直接请求——正确做法是将web根目录严格限定在`public/`,并通过服务端包含(`include_once`)安全调用逻辑文件。
你遇到的 404 The requested URL was not found on this server 错误,并非代码逻辑问题,而是Web服务器的安全设计机制在起作用:Apache(或Nginx)仅允许客户端直接访问其配置的 DocumentRoot(Apache)或 root(Nginx)目录下的文件;而你的 src/create.php 位于 Web 根目录之外,浏览器发起 GET /src/create.php 请求时,服务器根本不会执行该PHP文件,而是直接返回 404 —— 这是预期且必要的安全行为。
✅ 正确架构:public/ 为唯一Web入口,src/ 仅供服务端包含
你的目录结构本身合理(符合现代PHP项目分层规范),但表单 action 属性的写法存在根本性误解:
<!-- ❌ 错误:试图让浏览器直接访问 src/ 目录 -->
✅ 优势:
- 符合Web服务器安全策略(所有请求均落在
public/内); - 避免暴露敏感目录路径;
- 易于添加CSRF防护、输入验证等统一中间件逻辑。
方案二:使用 .htaccess 重写(仅限Apache,需启用 mod_rewrite)
若坚持保留 action="create.php" 形式,可在 public/.htaccess 中添加:
# public/.htaccess RewriteEngine On # 将对 create.php 的请求,内部转发到 src/create.php(不改变URL) RewriteRule ^create\.php$ ../src/create.php [L]
⚠️ 注意:此方式需确保Apache配置允许 .htaccess 覆盖(AllowOverride All),且 src/ 目录不可被直接浏览(建议在 src/.htaccess 中添加 Deny from all)。
⚠️ 重要安全提醒(务必执行)
-
禁止
src/目录被Web访问:
在src/.htaccess中添加:Deny from all
或在Nginx中配置:
location ^~ /src/ { deny all; } -
修复
create.php中的致命安全隐患:
当前SQL写法存在严重SQL注入风险(即使用了mysqli_real_escape_string,也无法完全防御所有场景):// ❌ 危险:拼接SQL + 过时的转义方式 $sql = "INSERT INTO todolist.tasks (title, description) VALUES ('$taskTitle', '$taskDescription')";✅ 应改为预处理语句(PDO或MySQLi):
// public/process.php 中调用(示例:MySQLi面向对象) $stmt = $conn->prepare("INSERT INTO todolist.tasks (title, description) VALUES (?, ?)"); $stmt->bind_param("ss", $taskTitle, $taskDescription); $stmt->execute(); -
检查Apache DocumentRoot配置:
确保你的虚拟主机配置指向public/目录,而非项目根目录:# Apache httpd-vhosts.conf <virtualhost> ServerName localhost DocumentRoot "C:/path/to/your/project/public" <!-- ✅ 必须是 public/ --> <directory> AllowOverride All Require all granted </directory></virtualhost>修改后重启Apache:
httpd -k restart。
? 快速验证是否生效
- 创建
public/info.php,内容为; - 访问
http://localhost/info.php—— 若显示PHP信息页,说明Web服务器+PHP解析正常; - 访问
http://localhost/src/create.php—— 应返回404或403(证明安全策略生效); - 提交表单后跳转至
index.php?create=success,说明流程打通。
? 总结:404不是Bug,而是Web服务器在保护你。真正的PHP应用必须遵循「单一入口」原则——所有HTTP请求经由
public/目录进入,业务逻辑藏于其后,通过服务端包含调用。这既是Laravel、ThinkPHP等框架的设计基石,也是生产环境安全运行的底线要求。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











