问题
I have been getting an issue with Laravel and the Storage
class.
I have create an upload form for users to control images used as logos in their account. I use Laravel File Storage inspired by Flysystem .
When I save an image, I proceed as follows :
// 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
]);
The upload works fine, I can find the uploaded picture under the appropriate file structure : storage\app\public\logos\1\automatic-filename.jpeg
In my view, I retrieve the image url as follows :
<img src="{{ Storage::disk('public')->url($account->logo) }}" />
Which gives me the correct path :
http://www.example.com/storage/logos/1/automatic-filename.jpeg
But no matter what I try, I get a 403 on the image
Forbidden You don't have permission to access /storage/logos/1/automatic-filename.jpeg on this server.
I think I have done everything correctly :
I have created the symbolic link from public/storage to storage/app/public with
php artisan storage:link
uploaded files are saved on the server, with a 755 permission. All concerned folders have the same permissions.
I really don't know where to look...
If anyone ever got a similar issue, thanks in advance for your input !
Best regards,
Vlad
回答1:
From inside /public
, run:
chown -R username:group storage
Of course replace username:group
with the same username:group
combo that you find against any other public file or folder when you run ls -l
whilst in the public
folder.
回答2:
To all that are interested in my solution...
I found out that Laravel was not allowed to access the files because /storage/ is before the root of my domain, which points to /public !
I changed the config/filesystem.php public root path drive to something public :
Original config :
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
Modified config :
'public' => [
'driver' => 'local',
'root' => public_path('uploads'),
'url' => env('APP_URL').'/uploads',
'visibility' => 'public',
],
Now all routes related to storage are in the public folder... and I can still use the convinient Storage class !
Hope it helps.
Vlad
回答3:
I'm guessing this 403 issue you were experiencing was having place in a shared hosting. When you create the symlink with php artisan storage:link
it contains the full absolute path to the storage/app/public
folder. This is what probably causes the 403 response by the server.
The solution is create a symlink with a relative path from the project root like
ln -s ../storage/app/public public/storage
This should solve the permissions problem.
回答4:
I created php artisan storage:link
with root permission. So /public/storage/... directory not accessible for users.
Go to /public
folder with command ls -l
you'll see group:owner permissions.
chown -h storage yourgroup:yourusername
Now directory accessible from browser.
回答5:
To access the storage folder you must have a symbolic link in the public folder. So, from public folder type ls
to view the storage link. If don't exist or it's in red, you have to create/updated it.
Creating a symbolic link
From public folder type something like this ln -s /path/to/your/storage/public/ storage
Fixing a symbolic link
Find where link pointed to: readlink -v storage
*Point link to new path: ln -sfn /path/to/your/storage/public/ storage
*Reference: REPAIRING BROKEN SYMBOLIC LINK
回答6:
as kJamesy said you should check if you have set the wrong owner to your files (for example if you created php artisan storage:link
with root).
To fix this, run from inside /public
:
chown -R username:group storage
Also you could check for file permission (when I copy the files with rsync the often lose read rights for other
leading to 403 Error). If the permissions are not correct, you can fix it by calling from insider /public:
find * -type d -exec chmod 755 {} \;
find * -type f -exec chmod 644 {} \;
回答7:
Go to root of laravel project
- Run this command : php artisan storage:link
- Edit public/.htaccess and add to it : Options +FollowSymlinks
- Run this command : chown -h USER:GROUP public/storage
Replace USER:GROUP with correct name.
来源:https://stackoverflow.com/questions/44247272/laravel-5-4-forbidden-403-on-files-in-storage-with-public-visibility