😅How to create laravel storage symbolic link for production or sub domain system? (Phần 2)

https://stackoverflow.com/questions/45825889/how-to-create-laravel-storage-symbolic-link-for-production-or-sub-domain-system

Ask QuestionAsked 5 years, 4 months agoModified 11 days agoViewed 90k times34

When I worked on laravel local development server php artisan storage:link works fine for me. But when I transfer my site to production server then I saw my public storage link was a folder. Then I delete that tried to create a link. I got an error because my app was in the root folder and tried to solve this problem.

ShareFollowedited Dec 13, 2017 at 18:10Cœur's user avatarCœur36.1k2424 gold badges191191 silver badges258258 bronze badgesasked Aug 22, 2017 at 19:49Mizanur Rahman Khan's user avatarMizanur Rahman Khan1,50211 gold badge1111 silver badges1919 bronze badges

Add a comment

13 Answers

Sorted by: Highest score (default) Trending (recent votes count more) Date modified (newest first) Date created (oldest first) 72

I solved this problem by another command for creating a symbolic link by terminal/cmd/shh:

ln -s /path/to/laravel/storage/app/public /path/to/public/storage

I solved this also Using laravel web route routes/web.php

Route::get('/foo', function () {
    Artisan::call('storage:link');
});

ShareFollowedited Dec 31, 2019 at 9:04answered Aug 22, 2017 at 19:49Mizanur Rahman Khan's user avatarMizanur Rahman Khan1,50211 gold badge1111 silver badges1919 bronze badges

Show 6 more comments39

Another simple way is to run Executing php artisan storage:link Command Programmatically

On routes/web.php

Route::get('/foo', function () {
Artisan::call('storage:link');
});

ShareFollowedited Apr 25, 2019 at 7:09Amir's user avatarAmir8,72177 gold badges4444 silver badges4848 bronze badgesanswered Mar 29, 2019 at 13:21Fhulufhelo Mokhomi's user avatarFhulufhelo Mokhomi55955 silver badges66 bronze badges

Add a comment6

In case anyone is looking for another flexible solution using php:

Route::get('/link', function () {        
   $target = '/home/public_html/storage/app/public';
   $shortcut = '/home/public_html/public/storage';
   symlink($target, $shortcut);
});

And make any required change to the $target variable and the $shortcut upon your files structure.

You can use the above code inside that web route or inside any other function.

ShareFollowanswered Jan 24, 2021 at 12:08Ali Ali's user avatarAli Ali1,65522 gold badges1717 silver badges3232 bronze badges

Add a comment5

assuming that your laravel project "public" directory and "public_html" directory are different. Or your subdomain pointer directory may be different , then use your subdomain pointer directory like "public_html" below given process.

apply command: $ php artisan storage:link

this command will create symlink to "public" directory to your laravel project. not inside the "public_html" . so we need to move the "storage" link to "public_html" directory. for this you can move directly. if it doesn't work then move it using command . go inside the "public" directory and run the below command according to your "public_html" directory location.

$ mv storage /home/yourHostinInfo/domains/domainName/public_html

the path might be different based on your hosting information.

ShareFollowanswered Apr 22, 2020 at 7:04AL-IMRAN's user avatarAL-IMRAN5111 silver badge22 bronze badgesAdd a comment3

Creating symbolic link in a web server using SSH

In Laravel documentation, a symbolic link (symlink or soft link) from public/storage to storage/app/public should be created to make files accessible from the web.

(THIS PROCEDURE WILL CREATE SYMBOLIC LINK WITHIN THE LARAVEL PROJECT DIRECTORY)

Here are the steps on how you can create symbolic link in your Linux web server using SSH client:

1. Connect and login to your web server using SSH client (e.g. PUTTY).

2. Link storage/app/public to public/storage using the syntax.

ln -s target_path link_path

Example (in CPanel File Directory)

ln -s /home/cpanel_username/project_name/storage/app/public /home/cpanel_sername/project_name/public/storage

ShareFollowanswered Jun 9, 2020 at 13:02Mateus Gonçalves's user avatarMateus Gonçalves66655 silver badges1515 bronze badgesAdd a comment2

If you are using a CPANEL web hosting its common for the domain root to be public_html directory which may be an issue as by default Laravel app will try to look for a folder called public in your project root. To solve this open your config/filesystems.php file and change:

/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/

'links' => [
    public_path('storage') => storage_path('app/public'),
],

to this:

/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/

'links' => [
    base_path('public_html/storage') => storage_path('app/public'),
],

Note that we have changed the links array value from the default public_path('storage') to our custom base_path('public_html/storage') directory

ShareFollowedited Apr 9, 2021 at 13:50answered Apr 8, 2021 at 23:41Software Developer's user avatarSoftware Developer71088 silver badges1111 bronze badgesAdd a comment1

I have an account on Hostinger.

I had a big problem with Laravel File Manager, but now I know what was the problem :)

It`s was an issue with a link to storage. My folder public_html had no link but the copy of storage!

  1. Delete this storage or rename it if you want backup :)

  2. Log in to ssh and use command pwd to get the current folder that will help you build a full path.

  3. Use this command:

    ln -s <target_path> <link_path>

In my case this was like:

ln -s /home/u16345434/domains/website.name/storage/app/public /home/u16345434/domains/website.name/public_html/storage

Good Luck :)

ShareFollowanswered Jan 18 at 21:38Adam Boniecki's user avatarAdam Boniecki5122 bronze badgesAdd a comment1

The easiest option is to run the following in a terminal

php artisan storage:link

I had an issue creating a symlink to a folder located under subdomain, tried everything for almost 3 hours, and no luck. My case was as follow:

  1. The uploads folder is located under subdomain: images.example.com.

  2. I upload images using the root document: $_SERVER['DOCUMENT_ROOT'].'/uploads/

  3. I want to create a symlink in that root document.

Finally, I tried this solution and it works as expected:

ln -s /home/customer/www/images.example.com/public_html/uploads /home/customer/www/example.com/public_html/uploads

Note: I used PuTTY to create that symlink

ShareFollowanswered Jun 25, 2020 at 14:59Jodyshop's user avatarJodyshop63688 silver badges1212 bronze badgesAdd a comment0

Just write in a php file (like symlink.php) the following code, place it in the website root folder (the folder you placed files in the public folder) and execute it by browsing in your browser to yourwebsite/symlink.php

<?php
symlink('/home/yourrootfolder/yourappfolder/storage/app/public', '/home/yourrootfolder/public_html/yourappfolder/storage');

ShareFollowanswered Aug 16 at 17:17Ayenew Yihune's user avatarAyenew Yihune8411010 silver badges1616 bronze badgesAdd a comment0

Here is the code that works for me in the production server

 Route::get('/linkstorage', function () {
    $targetFolder = base_path().'/storage/app/public';
    $linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage';
    symlink($targetFolder, $linkFolder);
 });

to solve the problem instead of ln -s path/to/target path/to/public/storage just type:

ln -srv ~/path/to/target ~/path/to/public/storage

but first create the folder storage in public.

  • Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center. – Prateek Varshney Oct 30 at 5:14

Add a comment-2

All you have to do is access the server through SSH, navigate to the root path where it is your laravel project, for example:

cd /path/to/your/domain/public_html

then navigate to the public directory(laravel project) and delete the storage directory if you have uploaded it...

and go back to the public_html and run the command:

php artisan storage:link

that will get the job done...

ShareFollow

Last updated