最常出问题的是 storage 和 bootstrap/cache 目录权限及用户组未设为 www:www,因 laravel 运行时需向这两目录写入日志、缓存等文件;nginx 若缺失 try_files 配置则会伪装成权限问题返回 500。

最常出问题的是 storage 和 bootstrap/cache 目录权限没设对,且用户组不是 www。
为什么是这两个目录?
Laravel 运行时会往 storage 写日志、缓存、session、视图编译文件;bootstrap/cache 则存放 packages.php、services.php 等框架级缓存。如果 PHP-FPM 进程(以 www 用户身份运行)没写入权限,就会直接报 500 错误,且日志里往往只显示 “Failed to write cache file”,不提示具体路径。
常见错误现象包括:
- 首页能打开,但登录后台/提交表单/清缓存时报 500
-
php artisan config:cache执行成功,但页面仍读不到新配置 - 日志文件
storage/logs/laravel.log停止更新,或提示Permission denied
权限设置不能只看数字,还得看用户组
宝塔面板里用文件管理器改权限时,很多人只调了数字(比如设成 777),却忽略了右下角的“用户”和“用户组”下拉框。Nginx + PHP-FPM 在宝塔默认以 www 用户和 www 组运行,所以必须确保:
chown -R www:www /www/wwwroot/your-project/storagechown -R www:www /www/wwwroot/your-project/bootstrap/cachefind /www/wwwroot/your-project/storage -type d -exec chmod 775 {} \;find /www/wwwroot/your-project/storage -type f -exec chmod 664 {} \;chmod 775 /www/wwwroot/your-project/bootstrap/cache
注意:public 目录只需 755,且不用改用户组——它由 Nginx 直接服务,不经过 PHP 写入。
Nginx 配置里漏掉 try_files 也会伪装成权限问题
很多开发者看到 500 就猛调权限,结果发现还是不行。其实是因为 Nginx 没把请求正确转发给 index.php,导致 Laravel 的异常处理机制根本没触发,Nginx 自己返回了 500(例如 “No input file specified”)。检查你的站点配置中是否有这行:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
如果没有,或者被注释掉了,Laravel 的路由就完全失效——这不是权限问题,而是入口没打通。宝塔新建站点时虽有 Laravel 伪静态模板,但如果你手动编辑过配置,很容易删掉或写错这一行。
真正卡住人的地方,往往不是哪一步最难,而是你确信“已经做对了”的那步,其实悄悄错了:比如 chmod 了目录,却忘了 chown;比如复制了伪静态规则,却漏掉了 fastcgi_param SCRIPT_FILENAME 的路径拼接;又比如开了 OPcache 却没清缓存,让旧的错误配置一直生效。部署不是线性流程,得把权限、用户组、Nginx 转发、PHP 运行上下文这四层一起对齐。











