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/storagetostorage/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.jpegcan be viewed by anyone by going tomysite.com/images/my-image.jpegHowever, 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.jpgandtest3.jpg) into that directory. Then inside my blade template for thesrcattribute of myimgtags 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:linkon the console, which according to the articles I read, should create asymbolic linkbetween the directoriespublic/storageandstorage/app/public. As soon as I ran the command, I got a new folder calledstoragecreated in thepublicdirectory. Then I moved all my images to thatpublic/storagedirectory. Then set thesrcattribute myimgtags 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/storagetostorage/app/publicand stored the images in thepublic/storagedirectory? - As happened with my case, if the files in the
public/storageare 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.