You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的行为:

  1. 打开项目配置文件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,
        ],
    ],
],
  1. 执行命令清除配置缓存,让修改生效:
    php artisan config:clear

注意:配置中的权限值必须以0开头,为八进制格式,不能省略前缀写成664/775,否则权限设置会不生效。

方案2:系统层调整用户组权限(更符合安全规范)

如果不想修改框架配置,可以从系统权限层面解决,保证WEB服务进程对storage下新建资源有读权限:

  1. 先确认WEB/PHP运行的所属用户,常见场景下Nginx+PHP-FPM、Apache的运行用户多为www-data,可通过以下命令确认:
    ps aux | grep php-fpm
  2. 执行以下命令调整组权限(将命令中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:24:21