宝塔部署Laravel需三步:一将网站根目录设为public目录并重启PHP;二执行chown -R www:www storage bootstrap/cache与chmod -R u+rwX storage bootstrap/cache;三配置官方Nginx伪静态规则并重载配置。

宝塔面板部署 Laravel 项目,最常出问题的不是代码,而是 public 目录没暴露、storage 和 bootstrap/cache 权限不对、伪静态规则漏掉或写错——这三处一错,500 或 404 就直接拦在首页。
public 目录必须设为网站根目录
Laravel 的入口文件 index.php 在 public 目录下,宝塔默认把整个 Laravel 项目根目录(含 app/、config/)设为网站根目录,这会导致敏感文件被直接访问,且路由无法解析。
- 在宝塔「网站」→「设置」→「网站目录」中,把「网站根目录」改为项目内
public子目录的绝对路径,例如/www/wwwroot/myapp/public - 确认「运行目录」留空(不要填
/public,那是旧版 Nginx 配置习惯,宝塔新版不认) - 改完立即重启 PHP 服务,否则部分环境变量(如
$_SERVER['DOCUMENT_ROOT'])仍指向旧路径
storage 和 bootstrap/cache 必须可写,但不能 777
storage 用于日志、缓存、session;bootstrap/cache 存编译后的配置和路由缓存。PHP 进程(通常是 www 用户)必须有写权限,但设成 777 会触发宝塔安全警告,且存在风险。
- 终端进入项目根目录,执行:
chown -R www:www storage bootstrap/cache
- 再执行:
chmod -R u+rwX storage bootstrap/cache
(注意末尾是大写 X,只给目录加执行权,不给文件加) - 检查是否生效:
ls -ld storage应显示drwxr-xr-x 1 www www类似结构,且子目录内文件属主为www - 若用宝塔「文件」管理器手动改权限,请务必勾选「递归修改」,否则只改了目录本身,子项仍不可写
伪静态必须用 Laravel 官方 Nginx 规则,不能套用 ThinkPHP 或 WordPress
宝塔内置的「Laravel」伪静态模板多数版本过旧,缺少对 .well-known、robots.txt 等静态资源的放行,或未禁用对 .env 的访问,极易导致配置泄露。
立即学习“PHP免费学习笔记(深入)”;
- 在「网站」→「设置」→「伪静态」中,清空原有内容,粘贴以下标准规则:
location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; # 根据你实际 PHP 版本端口调整,如 9001、9002 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(env|htaccess|htpasswd|ini|log|sh|sql|bak|swp)$ { deny all; } - 特别注意:
fastcgi_pass的端口要和你当前启用的 PHP 版本一致(可在「软件商店」→「PHP 管理」里查看监听端口) - 保存后点「重载配置」,不要只点「保存」——只有重载才真正生效
env 文件和 APP_KEY 不能漏,且 .env 要禁止 Web 访问
宝塔不会自动帮你生成 .env 或运行 php artisan key:generate,而 .env 若被 Nginx 错误暴露,数据库密码就全亮了。
- 先确认
.env文件存在且已配置好数据库、APP_URL、APP_KEY(若无 APP_KEY,SSH 进入项目根目录运行:php artisan key:generate --force) - 上面伪静态规则里的
location ~ \.(env|...)段就是干这个的,必须保留;若删了,直接在浏览器访问https://yoursite/.env就能下载全部配置 - 如果项目用了队列或 Horizon,还要确保
supervisor配置里指定的用户是www,且工作目录是项目根目录(不是public)
最麻烦的其实是权限和路径的耦合:改了根目录却忘了改 chown 范围,加了伪静态却没重载,或者 APP_KEY 是本地生成的、没同步到服务器——这些地方一漏,错误日志里往往只报模糊的 500 Internal Server Error,得去 /www/wwwlogs/yourdomain.error.log 里翻真实原因。











