Laravel 9 Storage上传图片访问报403 Forbidden权限问题
问题根因
该问题是Laravel 9版本对本地文件系统驱动的默认权限规则做了不兼容调整导致:
- Laravel 8及更早版本中,Storage组件新建目录、文件时默认继承父目录权限,因此只要初始给storage目录设置775权限,后续生成的所有文件、目录都会自动继承该权限,不会出现访问拒绝问题。
- Laravel 9开始,本地磁盘默认硬编码了新建资源的权限:目录默认755、文件默认644,且不会自动继承父目录权限。如果你的PHP运行进程(PHP-FPM/Apache)所属用户组,和你初始部署项目时设置storage权限的用户组不一致,就会出现新上传的文件WEB服务无读权限,访问返回403的问题。手动给新文件重设775权限后能正常访问,也印证了是默认权限配置不匹配导致的问题。
永久解决方案
二选一即可,优先选第一种,改动成本最低。
方案1:显式配置文件系统权限(推荐)
直接修改项目配置,把public磁盘的新建资源权限对齐你之前低版本Laravel的行为:
- 打开项目配置文件
config/filesystems.php,找到public磁盘的配置段,新增permissions配置项:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', // 新增以下权限配置 'permissions' => [ 'file' => [ 'public' => 0664, 'private' => 0600, ], 'dir' => [ 'public' => 0775, 'private' => 0700, ], ], ],
- 执行命令清除配置缓存,让修改生效:
php artisan config:clear
注意:配置中的权限值必须以0开头,为八进制格式,不能省略前缀写成664/775,否则权限设置会不生效。
方案2:系统层调整用户组权限(更符合安全规范)
如果不想修改框架配置,可以从系统权限层面解决,保证WEB服务进程对storage下新建资源有读权限:
- 先确认WEB/PHP运行的所属用户,常见场景下Nginx+PHP-FPM、Apache的运行用户多为
www-data,可通过以下命令确认:ps aux | grep php-fpm - 执行以下命令调整组权限(将命令中的
your_deploy_user替换为你实际部署项目的用户名):
# 将部署用户加入WEB运行用户组 usermod -a -G www-data your_deploy_user # 递归设置storage、bootstrap/cache目录的归属组为WEB运行用户组 chgrp -R www-data storage bootstrap/cache # 开启组继承,目录下新建的文件/目录自动归属父目录的用户组 chmod -R g+s storage bootstrap/cache # 重置现有目录的权限为775 chmod -R 775 storage bootstrap/cache
验证注意事项
- 不要为了省事给storage目录设置777权限,会带来严重的服务器安全风险
- 不要手动用
ln命令创建storage软链接,必须使用php artisan storage:link生成,避免软链接路径映射错误 - 修改配置后上传新的测试文件,可在服务器端通过
ls -l storage/app/public/对应目录/查看新生成文件的权限、归属组,确认WEB进程有读权限即可
内容的提问来源于stack exchange,提问作者Andrés Domínguez
相关产品推荐
相关产品推荐

