Laravel 5.4 - >对存储中具有“公共”可见性的文件禁止403

问题描述 投票:1回答:7

我在Laravel和Storage课上遇到了问题。

我已经为用户创建了一个上传表单,用于控制在帐户中用作徽标的图像。我使用了由File Storage启发的Laravel Flysystem

保存图像时,我按以下步骤操作:

// Store the logo in the public filesystem, and define a 'public' visibility

$logo = $request->file('logo')->store('logos/'.$account->id, 'public');

// Save the path in the database

$account->update([
  'logo' => $logo
]);

上传工作正常,我可以在相应的文件结构下找到上传的图片:storage\app\public\logos\1\automatic-filename.jpeg

在我看来,我检索图像网址如下:

<img src="{{ Storage::disk('public')->url($account->logo) }}" />

这给了我正确的道路:http://www.example.com/storage/logos/1/automatic-filename.jpeg

但无论我尝试什么,我都会在图像上得到403

禁止您无权访问此服务器上的/storage/logos/1/automatic-filename.jpeg。

我想我已经做好了一切:

  • 我用php artisan storage:link创建了从公共/存储到存储/ app / public的符号链接
  • 上传的文件以755权限保存在服务器上。所有相关文件夹具有相同的权限。

我真的不知道在哪里看......

如果有人遇到类似问题,请提前感谢您的意见!

最好的祝福,

弗拉德

php linux image laravel laravel-5.4
7个回答
7
投票

/public内部,运行:

chown -R username:group storage

当然,当您在username:group文件夹中运行username:group时,使用与任何其他公共文件或文件夹相同的ls -l组合替换public


3
投票

对所有对我的解决方案感兴趣的人......

我发现Laravel不允许访问文件,因为/ storage /位于我的域的根目录之前,它指向/ public!

我将config / filesystem.php公共根路径驱动器更改为public:

原始配置:

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

修改配置:

'public' => [
   'driver' => 'local',
   'root' => public_path('uploads'),
   'url' => env('APP_URL').'/uploads',
   'visibility' => 'public',
],

现在所有与存储相关的路径都在公共文件夹中......我仍然可以使用方便的存储类!

希望能帮助到你。

弗拉德


1
投票

我用root权限创建了php artisan storage:link。因此,用户无法访问/ public / storage / ...目录。

使用命令/public转到ls -l文件夹,您将看到group:owner permissions。

chown -h storage yourgroup:yourusername

现在可从浏览器访问目录。


0
投票

要访问存储文件夹,您必须在公用文件夹中具有符号链接。因此,从公共文件夹类型ls查看存储链接。如果不存在或者是红色,则必须创建/更新它。

创建符号链接

从公共文件夹类型这样的ln -s /path/to/your/storage/public/ storage

修复符号链接

找到链接指向的位置:readlink -v storage

*指向新路径的链接:ln -sfn /path/to/your/storage/public/ storage

*参考:REPAIRING BROKEN SYMBOLIC LINK


0
投票

正如kJamesy所说,你应该检查你是否为你的文件设置了错误的所有者(例如,如果你用root创建了php artisan storage:link)。

要解决此问题,请从/public内部运行:

chown -R username:group storage

您还可以检查文件权限(当我使用rsync复制文件时,other经常失去读取权限,导致403错误)。如果权限不正确,您可以通过调用insider / public来修复它:

find * -type d -exec chmod 755 {} \;
find * -type f -exec chmod 644 {} \;

0
投票

转到laravel项目的根目录

  1. 运行此命令:php artisan storage:link
  2. 编辑public / .htaccess并添加到它:Options + FollowSymlinks
  3. 运行以下命令:chown -h USER:GROUP public / storage

用正确的名称替换USER:GROUP。


-1
投票

我猜这个你遇到的403问题是在共享主机中占有一席之地。使用php artisan storage:link创建符号链接时,它包含storage/app/public文件夹的完整绝对路径。这可能是服务器导致403响应的原因。

解决方案是创建一个符号链接,其中包含来自项目根目录的相对路径

ln -s ../storage/app/public public/storage

这应该解决权限问题。

© www.soinside.com 2019 - 2024. All rights reserved.