Laravel 显示存储文件夹中的图像时出现 403 错误

问题描述 投票:0回答:4

我无法访问保存到存储文件夹的文件。我能够上传、文件、保存文件。例如,如果我运行 size 方法,它会获取上传图像的文件大小,但在显示文件时,我会收到 403 错误。我使用 laravel artisan 命令创建符号链接,我尝试手动创建符号链接。我已经检查以验证follow symlinks是否在我的apache配置中,我可以从shell cd进入它,权限是777(我有755,但在试图找出问题所在时,我将其更改为777)符号链接的所有权并且里面的文件与公共目录中的所有其他文件都是相同的用户和组。

我太累了,所以也许我只是错过了一些明显的东西,但我一生都无法弄清楚出了什么问题。该文件显然存在,其可见性设置为“公开”。有什么原因导致我能够写入目录但无法显示保存在那里的图像?

编辑1: 网络

  • 应用程序
  • 引导程序
  • 配置
  • 数据库
  • 错误
  • 节点模块
  • 公开
  • 资源
  • 路线
  • 统计数据
  • 存储
  • 温度
  • 供应商
  • 是基本结构,public内部有一个符号链接指向storage/app/public

    我的存储文件夹配置的文件系统是:

    'public' => [
                'driver' => 'local',
                'root' => storage_path('app/public'),
                'url' => env('APP_URL').'/storage',
                'visibility' => 'public',
            ],
    

    此时我还没有真正编辑基本 Laravel 安装中的任何内容。我确实读过其他人有类似的问题,说他们的问题是他们不允许访问文档根目录之外的目录。因此,他们只是将所有上传内容都转到其公共文件夹,而不是使用存储文件夹。我确实将文档根目录设置为我的公共文件夹。这会是一个问题吗? (如果需要,我可以编辑我的 apache 文件)

    apache laravel-5 laravel-storage
    4个回答
    8
    投票

    好的 - 睡了一会儿,今天早上查看了所有内容,意识到当以网站所有者身份登录时,一切看起来都很好,但是当以 root 身份登录时,它显示链接已损坏。基本上,artisan 创建一个绝对链接,/storage/app/public 作为网站所有者就可以了,因为它是一个监狱帐户,其“根”目录是 web 文件夹。然而,它实际上是创建一个到系统根目录的符号链接,通常帐户无权访问该系统根目录,因此它返回 403

    基本上,我只是通过删除 laravel 创建的损坏的符号链接并将其作为相对链接而不是绝对链接,并在公共目录中输入: ln -s ../存储/应用程序/公共存储


    0
    投票

    我也遇到了同样的问题,经过大量调试后,我设法找出导致 403 错误的实际问题。

    解决方案很简单,在

    配置/文件系统.php 在定义 public_path 和存储路径的地方,您必须具有相同/相同的 public_path 名称和 storage_path 最终目录名称。

    示例:

    1. 错误:
    public_path('brands') => storage_path('storage/app/public/brandimages');
    

    这将生成 403 错误,“since public_path('brands')”与“storage_path('../../../brandsimage')”不同。

    1. 正确:
    public_path('brands') => storage_path('storage/app/public/brands');
    

    现在 public_path('brands') 和 "storage_path('../../../brands')" 是相同的,因此,将生成正确的符号链接,从而解决 403 错误。

    使用以下 artisan 命令生成符号链接

    php artisan storage:link
    

    如果需要生成相对链接,则使用以下命令

    php artisan storage:link --relative
    

    0
    投票

    我的主机是clud服务器,我的站点路径是/httpdocs

    该解决方案对我有用,是:

    从文件夹 /httpdocs/public 中,执行 ln -s ../storage/app/public storage

    然后一切正常。


    0
    投票

    我在 Laravel 11 中通过 API 提供头像图像时遇到了这个问题。 解决了

    declaring the disk explicitly
    。 而不是

    $filepath = Storage::put('path/', $data['avatar']);
    

    $filepath = Storage::disk("public")->put('path/', $data['avatar']);
    

    稍后向 API 提供用户个人资料时,请使用

    UserResource
    并在其中

    public function toArray(Request $request): array
    {
        // return parent::toArray($request);
        return [
            ...
            'avatar'=> asset(Storage::url($this->avatar)),
            ...
        ];
    }
    
    © www.soinside.com 2019 - 2024. All rights reserved.