laravel部署必须将web根目录设为public以防止敏感文件泄露;需确认public/index.php存在,apache/nginx/宝塔均须指向/public路径;关闭防跨站并清空open_basedir,补.public/.user.ini;设置storage与bootstrap/cache权限;验证.env不可访问且资源路径正确。

部署 Laravel 项目时,若 public 目录未被设为唯一 Web 可访问入口,.env 文件、config/database.php、storage/app 等敏感路径可能被直接下载——这不是理论风险,Nginx 漏配 try_files 或 Apache 未启用 mod_rewrite 时,真实发生过多次泄露事件。
确认 Web 服务器根目录是否指向 public
打开终端,进入项目根目录,执行:ls -la public/index.php。如果文件存在,说明 public 目录结构完整;若报错“No such file”,请先检查是否误删或移动了该目录。
Apache 用户:运行 sudo apachectl -t -D DUMP_VHOSTS | grep -A 5 "ServerName\|DocumentRoot",确认 DocumentRoot 后的路径结尾是 /public,不是 /your-project/ 或 /your-project/public_html/。
Nginx 用户:执行 nginx -T 2>/dev/null | grep -A 3 "root.*;",输出中 root 行末尾必须是 /public,且该行需在 server 块内,不能出现在 http 或 location 块里。
宝塔用户:网站 → 你的站点 → 根目录 → 点右侧「修改」→ 路径必须为 /www/wwwroot/your-site/public,不能是 /www/wwwroot/your-site/。
关闭宝塔防跨站攻击并清理 open_basedir
方法一:面板操作
网站 → 你的站点 → 配置文件 → 找到「防跨站攻击」开关 → 关闭 → 保存。
方法二:手动清空 open_basedir(更稳妥)
网站 → 你的站点 → PHP 设置 → 在「禁用函数」下方找到「open_basedir」输入框 → 清空全部内容 → 保存 → 重启 PHP。
⚠️ 注意:只关面板开关但不清空 open_basedir 值,部分宝塔版本仍会残留配置,导致 vendor/autoload.php 找不到。
在 public 目录补 .user.ini 覆盖父级限制
第一步:用宝塔文件管理器或 SSH 进入 /www/wwwroot/your-site/public/
第二步:创建或编辑 .user.ini 文件,写入以下内容:
open_basedir=/www/wwwroot/your-site/:/tmp/:/proc/:/dev/
第三步:执行命令重载 PHP 配置(路径按你实际 PHP 版本调整):
kill -USR2 $(cat /www/server/php/80/var/run/php-fpm.pid)
这一步必须做。否则即使面板已关闭防跨站,父目录自动生成的 .user.ini 仍会继承 open_basedir 限制,导致 storage/logs/laravel.log 写入失败。
设置 storage 和 bootstrap/cache 写入权限
执行以下两条命令(假设 Web 服务器用户为 www):
sudo chown -R www:www storage bootstrap/cache
sudo chmod -R 755 storage bootstrap/cache
权限不对会导致 Class 'App\Providers\AppServiceProvider' not found 错误——这不是类名写错,而是服务提供者缓存写入失败后,bootstrap/cache/packages.php 文件损坏所致。
验证 .env 是否不可直接访问
在浏览器中访问 http://你的域名/.env。
返回 404 或 403 即为正常;若显示明文内容,说明 public 未生效或 Web 服务器配置未重载。
同时访问 http://你的域名/public/css/app.css,若返回 404,说明资源路径错误,应检查是否在 Blade 中误用了 /public/css/app.css 而非 {{ asset('css/app.css') }}。











