What I have done
When I researched about storing files in laravel. I came across two approaches.
- Storing the assets directly inside the public folder.
- Creating a symbolic link from
public/storage
tostorage/app/public
When I researched about which one two use, I came across this stack overflow link. Difference between storing files in public directory and in storage in Laravel 5.4 In this link in the top answer it was mentioned,
Public folder means files will be publicly accessible.
For example an image stored in
public/images/my-image.jpeg
can be viewed by anyone by going tomysite.com/images/my-image.jpeg
However, files stored in storage directory are only available to your app.
Since, including in the mentioned stack overflow post above, and many other posts I have read on different platforms implied the fact that files in the public
directory are web accessible whereas the files inside the storage
directory are not, I tried to test this by storing files both in the public
directory and in the storage
directory one at a time, and then checking if the files are accessible through the web url.
My attempts went as below,
- First I added the path
images/
in the public directory and placed some images (Let us saytest1.jpg
,test2.jpg
andtest3.jpg
) into that directory. Then inside my blade template for thesrc
attribute of myimg
tags I referred to them asURL('images/test1.jpg')
etc... and they were indeed rendered on the webpage. Then I also tried to access the images from the url by going tohttp://localhost:8000/images/test.jpg
. The result was as expected, The images were rendered on the web page + they were accessible from the url - Then I ran the command
php artisan storage:link
on the console, which according to the articles I read, should create asymbolic link
between the directoriespublic/storage
andstorage/app/public
. As soon as I ran the command, I got a new folder calledstorage
created in thepublic
directory. Then I moved all my images to thatpublic/storage
directory. Then set thesrc
attribute myimg
tags asURL('storage/test1.img')
etc... the images were rendered on the web page. Then I tried to check if the images are still accessible from the url. for that on the url bar I went tohttp://localhost:8000/storage/test1.jpg
. The images were STILL ACCESSIBLE from the url.
Problem
However, according to the answer I have mentioned and some other similar links, I expected those images to not be accessible from the url in the 2) above since the images should now be actually in the storage/app/public
which we have created a symbolic link to from public/storage
. (Files inside the storage
directory should not be publicly accessible right?)
This led me to two questions,
- Why are the images are still being accessible from the url even after I created a symbolic link from
public/storage
tostorage/app/public
and stored the images in thepublic/storage
directory? - As happened with my case, if the files in the
public/storage
are still accessible through the web url, what are the advantages of actually creating the symbolic link? It does not seem to offer any more security since the files are still accessible from the url.
It would be really helpful if anyone can help me understand the answers to the above two questions I have. Thanks.