刚入门时我把 index.php 放在项目根目录跑了一个月,直到学会看 access.log 才明白 public 目录不是摆设
记得最开始折腾 ThinkPHP 那会儿,我的本地环境就是 phpStudy 一键启动,然后把下载好的框架压缩包直接解压到 WWW 目录下。浏览器里输入 localhost/tp6/index.php,能出页面,还挺高兴,觉得自己已经算"部署成功"了。
就这么跑了一个多月,直到某天把项目打包上传到云服务器,朋友扫了一眼 URL,问我:"你直接把 index.php 放根目录,那 .env 和 vendor 不是全裸奔了?"我当时还嘴硬,说本地能跑就行,哪有那么夸张。结果他直接在浏览器里敲了我的IP加/.env,数据库密码明晃晃挂在那儿,瞬间打脸。
后来才搞懂,不管是 TP、Laravel 还是现在主流的 CMS,框架把入口文件关进 public 目录里,不是为了给你添堵,而是把"能被外界直接访问的"和"不该被外界访问的"从物理层面隔开。本地调试时,真正的重点不是"哪个文件夹里有 index.php",而是你的 Web 服务器到底把哪个目录当成了 Document Root。
我以前的本地配置是:Nginx 的 root 指向了项目根目录,然后靠"文件存在就访问,不存在就 rewrite"这种半吊子规则蒙混过关。正确的做法应该是让 root 直接落到 public 文件夹,或者像我在 Windows 下用 phpStudy 时,给每个站点单独绑定域名并手动把根目录