Laravel Storage Link Tidak Berfungsi di Hosting? Ini Cara Memperbaikinya
Server Solusi – Setelah aplikasi Laravel dipindahkan dari localhost ke hosting, salah satu masalah yang mungkin muncul adalah gambar atau file upload tidak bisa ditampilkan, meskipun proses upload terlihat berhasil. Ketika URL file dibuka langsung melalui browser, hasilnya bisa berupa error 404 Not Found, 403 Forbidden, atau bahkan 500 Internal Server Error.
Salah satu penyebab yang perlu diperiksa adalah storage:link. Perintah ini digunakan Laravel untuk membuat symbolic link dari direktori public/storage menuju storage/app/public, sehingga file yang disimpan di disk public dapat diakses melalui web.
Masalahnya, keberhasilan menjalankan perintah tersebut belum tentu berarti file bisa diakses dari browser. Struktur direktori hosting, izin akses, konfigurasi web server, dan lokasi document root juga berpengaruh.
Dalam panduan ini, saya akan membahas cara memeriksa masalah tersebut secara bertahap. Karena belum ada log error atau detail lingkungan hosting yang diberikan, langkah-langkah berikut merupakan panduan diagnosis untuk beberapa kondisi yang umum ditemukan, bukan laporan perbaikan yang sudah diuji pada server tertentu.
Mengapa Laravel storage link tidak berfungsi di hosting?
Laravel storage link biasanya bermasalah karena symbolic link belum dibuat, mengarah ke direktori yang salah, tidak diizinkan oleh hosting, atau tidak dapat diakses oleh web server. File yang diminta juga mungkin memang tidak ada di lokasi penyimpanan yang sesuai.
Mulailah dengan memeriksa keberadaan public/storage, lokasi file di storage/app/public, serta URL file yang gagal dibuka. Jika kamu menggunakan shared hosting tanpa akses SSH, proses pemeriksaan dan pembuatan symbolic link mungkin perlu dilakukan melalui File Manager atau bantuan penyedia hosting.
Gejala dan kemungkinan penyebab
Sebelum mengubah konfigurasi, cocokkan gejala yang muncul dengan kemungkinan penyebabnya. Kode HTTP dapat membantu mempersempit pemeriksaan, tetapi bukan bukti tunggal karena perilaku server bergantung pada konfigurasi yang digunakan.
| Gejala | Kemungkinan penyebab | Pemeriksaan awal |
|---|---|---|
| Gambar menghasilkan 404 | File tidak ada atau URL salah | Periksa lokasi file dan URL |
| Gambar menghasilkan 403 | Akses ditolak oleh server atau izin direktori tidak memadai | Periksa permission dan aturan web server |
Perintah storage:link gagal | Link sudah ada, direktori tujuan bermasalah, atau pembuatan symlink dibatasi | Periksa public/storage |
| Link ada, tetapi gambar tetap tidak muncul | Link putus, target salah, atau web server tidak mengikuti symlink | Periksa target link dan log |
| Upload berhasil, tetapi file tidak ditemukan | File tersimpan di disk atau direktori yang berbeda | Periksa config/filesystems.php |
| URL gambar mengarah ke domain atau path yang salah | APP_URL, konfigurasi disk, atau konfigurasi reverse proxy tidak sesuai | Periksa URL hasil generate |
1. Symbolic link belum dibuat atau mengarah ke lokasi yang salah
Secara default, Laravel menggunakan storage/app/public untuk file yang memang ditujukan agar dapat diakses publik. Direktori public/storage kemudian menjadi jalur akses dari web ke lokasi penyimpanan tersebut.

Struktur yang diharapkan kurang lebih seperti berikut:
laravel-app/├── app/├── config/├── public/│ └── storage -> ../storage/app/public├── storage/│ └── app/│ └── public/│ └── images/│ └── foto.jpg└── artisanTanda panah pada storage menunjukkan symbolic link, bukan direktori biasa yang berisi salinan file.
Pada hosting, struktur folder bisa berbeda. Misalnya, folder aplikasi berada di luar public_html, sedangkan document root domain diarahkan ke folder public milik Laravel. Karena itu, jangan langsung menganggap bahwa public/storage di direktori aplikasi merupakan lokasi yang sedang dilayani oleh web server.
2. File tersimpan di direktori yang berbeda
File yang diunggah melalui Laravel tidak otomatis masuk ke folder publik. Lokasinya bergantung pada disk dan konfigurasi penyimpanan yang digunakan.
Sebagai contoh, file yang disimpan melalui disk public biasanya berada di:
storage/app/public/images/foto.jpgSementara itu, URL publiknya umumnya berbentuk:
https://domainkamu.com/storage/images/foto.jpgJika aplikasi menyimpan file pada disk local, disk khusus, atau layanan cloud seperti Amazon S3, mekanisme aksesnya bisa berbeda. Jangan membuat symbolic link baru sebelum memastikan disk yang digunakan memang public.
3. Hosting membatasi symbolic link
Pada sebagian shared hosting, pembuatan symbolic link dibatasi oleh kebijakan keamanan atau hak akses akun. Akibatnya, perintah Artisan bisa gagal meskipun kode Laravel tidak bermasalah.
Ada juga kondisi ketika symbolic link berhasil dibuat, tetapi web server tidak mengizinkan akses melalui link tersebut.
Jika ini terjadi, pemeriksaan perlu dilakukan pada sisi hosting. Mengubah permission menjadi 777 bukan solusi yang tepat karena dapat membuka akses tulis yang tidak diperlukan.
4. Permission atau konfigurasi web server tidak sesuai
Web server harus dapat melewati direktori induk dan membaca file tujuan. Hak akses yang terlalu ketat dapat menyebabkan 403, sedangkan konfigurasi yang membatasi symbolic link dapat membuat file tetap tidak tersedia.
Pada Apache dan Nginx, aturan akses serta perilaku symbolic link tidak selalu sama. Karena konfigurasi hosting belum diketahui, periksa log sebelum mengubah konfigurasi server.
Cara diagnosis Laravel storage link di hosting
Agar pemeriksaan tidak melebar, lakukan langkah berikut secara berurutan. Contoh perintah di bawah menggunakan asumsi aplikasi Laravel berjalan pada Linux dan kamu memiliki akses SSH ke direktori proyek. Jika memakai shared hosting tanpa SSH, gunakan File Manager untuk pemeriksaan file dan minta bantuan penyedia hosting untuk bagian yang membutuhkan akses server.

1. Pastikan kamu berada di direktori proyek Laravel
Jalankan:
pwdls -laPerintah pertama menunjukkan direktori kerja saat ini. Perintah kedua menampilkan isi direktori, termasuk file tersembunyi.
Di direktori utama proyek Laravel, biasanya terdapat file artisan, direktori app, bootstrap, config, public, dan storage.
Jika file artisan tidak ditemukan, kamu mungkin berada di direktori yang salah.
Setelah memastikan lokasinya, periksa apakah Artisan dapat dijalankan:
php artisan --versionPerintah ini membantu memastikan bahwa PHP CLI tersedia dan aplikasi dapat menjalankan Artisan. Jika muncul error PHP atau dependency, selesaikan masalah tersebut terlebih dahulu sebelum mencoba membuat symbolic link.
2. Periksa keberadaan symbolic link
Jalankan:
ls -ld public/storagereadlink public/storagePerintah pertama menampilkan informasi direktori atau link. Perintah kedua menunjukkan target symbolic link jika public/storage memang berupa link yang valid.
Interpretasikan hasilnya sebagai berikut:
Jika
public/storagetidak ditemukan, link mungkin belum dibuat.Jika hasil menunjukkan direktori biasa, periksa apakah direktori tersebut dibuat secara manual atau merupakan struktur lama.
Jika target mengarah ke lokasi yang tidak sesuai, link perlu diperiksa sebelum diperbaiki.
Jika target terlihat benar, lanjutkan dengan memeriksa keberadaan file dan akses melalui browser.
Untuk mengetahui apakah target link dapat diakses, kamu juga bisa menjalankan:
test -d public/storage && echo "Target dapat diakses" || echo "Target tidak ditemukan atau tidak dapat diakses"Pesan tersebut hanya menunjukkan hasil pemeriksaan direktori dari sisi akun yang menjalankan perintah. Itu belum membuktikan bahwa web server bisa mengaksesnya.
3. Pastikan file yang diminta benar-benar tersedia
Misalnya, URL gambar yang gagal dibuka adalah:
https://domainkamu.com/storage/images/foto.jpgPeriksa file sumbernya:
ls -l storage/app/public/images/foto.jpgJika file ditemukan, lanjutkan ke pemeriksaan symbolic link dan web server.
Jika file tidak ditemukan, jangan langsung menyimpulkan bahwa storage:link rusak. File mungkin tersimpan pada disk lain, nama file di database tidak cocok, atau proses upload menyimpan file ke direktori yang berbeda.

Periksa juga konfigurasi disk pada:
config/filesystems.phpPada konfigurasi standar, disk public mengarah ke storage/app/public. Namun, proyek yang sudah dimodifikasi dapat menggunakan root atau URL yang berbeda. Dokumentasi resmi Laravel menjelaskan hubungan antara disk, lokasi penyimpanan, dan URL publik.
4. Periksa URL yang dibuat aplikasi
Jika file tersedia dan symbolic link tampak benar, periksa URL yang digunakan pada atribut src gambar atau tautan file.
Contoh penggunaan helper Laravel:
<img src="{{ asset('storage/images/foto.jpg') }}" alt="Foto">Jika file disimpan menggunakan disk public, kamu juga dapat membuat URL melalui Storage:
use Illuminate\Support\Facades\Storage;$url = Storage::disk('public')->url('images/foto.jpg');Kedua pendekatan tersebut tidak memperbaiki symbolic link yang rusak. Fungsinya adalah menghasilkan URL sesuai konteksnya.
Jika URL yang dihasilkan mengarah ke domain lama, subdirektori yang salah, atau skema HTTP ketika situs menggunakan HTTPS, periksa APP_URL dan konfigurasi disk public. Jangan mengubah konfigurasi sebelum memastikan bahwa masalahnya memang berasal dari URL.
5. Periksa log Laravel dan web server
Untuk melihat error aplikasi Laravel terbaru, jalankan:
tail -n 100 storage/logs/laravel.logPerintah ini menampilkan hingga 100 baris terakhir dari file log tersebut. Jika file tidak ada atau tidak berisi informasi yang relevan, periksa file log lain yang digunakan aplikasi.
Perlu diperhatikan bahwa permintaan gambar statis yang ditolak web server belum tentu tercatat di log Laravel. Jika file gambar menghasilkan 403 atau 404, periksa juga error log Apache atau Nginx melalui panel hosting atau lokasi log yang dikonfigurasi administrator.
Jangan menganggap satu pesan error sebagai penyebab pasti tanpa mencocokkan waktu kejadian, URL yang diminta, dan lokasi file yang sebenarnya.
Langkah memperbaiki storage link yang tidak berfungsi
Setelah mengetahui kondisi link, lokasi file, dan hasil pengujian, pilih solusi yang sesuai. Tidak semua kasus perlu membuat ulang symbolic link.
1. Buat symbolic link jika memang belum tersedia
Jika public/storage belum ada, masuk ke direktori utama Laravel lalu jalankan:
php artisan storage:linkPerintah tersebut membuat symbolic link berdasarkan konfigurasi links di config/filesystems.php. Pada konfigurasi standar, link menghubungkan public/storage dengan storage/app/public.
Setelah perintah selesai, periksa kembali:
ls -ld public/storagereadlink public/storageJika link sudah mengarah ke lokasi yang benar, coba akses URL file melalui browser.
Bagaimana jika perintah menghasilkan error?
Jika target sudah ada, periksa apakah target itu direktori biasa atau symbolic link lama.
Jika muncul pesan
Permission denied, periksa hak akses akun dan kebijakan hosting.Jika muncul error lain, baca pesan lengkapnya sebelum mengambil tindakan berikutnya.
Jangan langsung menghapus public/storage hanya untuk mengulang perintah. Direktori tersebut bisa saja berisi file yang tidak tersimpan di tempat lain.
2. Perbaiki symbolic link yang mengarah ke lokasi yang salah
Jika link ditemukan tetapi targetnya tidak sesuai, pastikan dulu lokasi sumber dan document root yang sebenarnya.
Misalnya, struktur hosting yang digunakan adalah:
/home/USER/├── laravel-app/│ └── storage/app/public/└── public_html/Jika domain memang menggunakan public_html sebagai document root dan kamu ingin file publik Laravel dilayani dari sana, link harus dibuat pada lokasi yang sesuai dengan struktur tersebut.
Namun, jangan menyalin contoh ini secara langsung. Pada hosting lain, document root bisa menunjuk ke laravel-app/public, sehingga lokasi link yang benar berbeda.
Sebelum memperbaiki link, catat target yang lama dan pastikan tidak ada data unik di lokasi yang akan diubah. Jika sudah yakin link lama memang salah, buat link baru menggunakan path absolut yang sesuai.
Contoh jika target publik yang benar adalah /home/USER/laravel-app/storage/app/public dan direktori public/storage belum ada:
ln -s /home/USER/laravel-app/storage/app/public public/storageJalankan dari direktori yang benar dan ganti path contoh dengan path aktual. Perintah ini gagal jika nama tujuan sudah ada. Jangan menggunakan opsi pemaksaan untuk menimpa tujuan sebelum memeriksa isinya.
Jika hosting tidak mengizinkan symbolic link lintas direktori, tanyakan kepada penyedia hosting mengenai batasan tersebut atau gunakan alternatif penyimpanan publik yang didukung.
3. Periksa permission tanpa membuka akses berlebihan
Jika file ada dan link benar, tetapi browser menampilkan 403, periksa permission direktori dan file:
ls -ld storage storage/app storage/app/publicls -l storage/app/public/images/foto.jpgWeb server memerlukan izin untuk melewati direktori induk serta membaca file tujuan. Pengaturan yang dibutuhkan bergantung pada pemilik file, grup, dan cara PHP dijalankan.
Hindari langsung menjalankan:
chmod -R 777 storagePerintah tersebut memberikan izin baca, tulis, dan eksekusi kepada semua pengguna yang berlaku pada file dan direktori yang diproses. Ini berisiko dan biasanya bukan perbaikan yang diperlukan untuk file publik.
Sebagai gantinya, tentukan terlebih dahulu pengguna yang menjalankan PHP atau web server, lalu sesuaikan kepemilikan dan permission berdasarkan kebutuhan aplikasi. Jangan mengubah kepemilikan seluruh proyek tanpa memahami dampaknya terhadap proses deployment dan aplikasi yang sedang berjalan.
4. Periksa konfigurasi disk public
Buka config/filesystems.php dan periksa konfigurasi disk public. Bentuk konfigurasi standar pada Laravel modern kurang lebih seperti berikut:
'public' => ['driver' => 'local','root' => storage_path('app/public'),'url' => env('APP_URL').'/storage','visibility' => 'public','throw' => false,],Gunakan konfigurasi yang sesuai dengan versi Laravel dan kebutuhan aplikasimu. Jangan mengganti seluruh konfigurasi hanya karena gambar tidak muncul.
Pastikan juga .env memiliki alamat aplikasi yang sesuai:
APP_URL=https://domainkamu.comJika konfigurasi diubah dan aplikasi menggunakan configuration cache, kamu mungkin perlu memperbaruinya:
php artisan config:clearPerintah ini membersihkan cache konfigurasi Laravel. Jalankan dengan hati-hati pada aplikasi produksi karena aplikasi akan kembali membaca konfigurasi saat diperlukan. Setelah itu, uji URL yang dihasilkan kembali.
Perlu diingat, perubahan APP_URL tidak memperbaiki link yang putus. Langkah ini hanya relevan ketika URL yang dibuat aplikasi memang salah.
5. Jika shared hosting menolak pembuatan symbolic link
Pada sebagian hosting, kamu tidak memiliki akses SSH atau penyedia hosting membatasi pembuatan symlink.
Langkah yang bisa dilakukan:
Periksa apakah File Manager menyediakan informasi tentang symbolic link.
Pastikan file yang ingin dipublikasikan berada di
storage/app/public.Tanyakan kepada penyedia hosting apakah symbolic link diizinkan untuk akun dan direktori tersebut.
Minta bantuan membuat link yang benar jika hak akses pembuatan link dibatasi.
Jika symlink memang tidak didukung, pertimbangkan mekanisme penyajian file alternatif yang sesuai dengan konfigurasi hosting.
Menyalin file secara manual dari storage/app/public ke public/storage bisa menjadi solusi sementara pada kondisi tertentu, tetapi bukan pengganti yang setara. File baru tidak otomatis ikut tersalin, sehingga proses upload berikutnya bisa kembali menghasilkan gambar yang tidak tersedia.
Jika kamu memilih metode alternatif, pastikan proses upload, pembaruan, dan penghapusan file tetap konsisten. Jangan menempatkan file sensitif seperti dokumen pribadi atau berkas internal di direktori publik.
Verifikasi setelah perbaikan
Setelah perubahan dilakukan, jangan hanya mengandalkan pesan keberhasilan dari Artisan. Lakukan pengujian dari sisi file dan HTTP.
1. Periksa file melalui symbolic link
test -f public/storage/images/foto.jpg \&& echo "File ditemukan melalui link" \|| echo "File tidak ditemukan melalui link"Jika hasilnya menyatakan file ditemukan, itu menandakan path dapat diakses dari lingkungan shell yang menjalankan perintah. Akses dari web server masih perlu diuji.
2. Uji URL file melalui HTTP
Jalankan perintah berikut dari terminal:
curl -sS -o /dev/null -w "%{http_code}\n" \https://domainkamu.com/storage/images/foto.jpgGanti URL dengan alamat file yang sebenarnya.
Hasil yang diharapkan adalah 200, selama file memang tersedia dan diizinkan untuk diakses publik. Jika mendapat 301 atau 302, periksa tujuan redirect. Jika 403 atau 404, lanjutkan pemeriksaan pada konfigurasi web server, path, dan permission.
Perintah ini menguji respons HTTP, bukan memastikan isi gambar valid. Untuk memastikan file dapat ditampilkan, buka URL tersebut melalui browser dan periksa apakah gambar benar-benar muncul.
3. Periksa log jika masih gagal
Jika pengujian tetap menghasilkan error, catat URL yang gagal, status HTTP, dan waktu pengujian. Cocokkan dengan log Laravel dan log web server.
Jangan langsung me-restart Nginx atau Apache hanya karena gambar tidak muncul. Untuk masalah symbolic link biasa, restart layanan umumnya bukan langkah pertama yang diperlukan.
Pencegahan agar masalah tidak berulang
Ada beberapa pemeriksaan yang layak dimasukkan ke prosedur deployment Laravel:
Periksa lokasi penyimpanan: pastikan disk
publicmengarah ke direktori yang dimaksud.Buat link saat deployment: jalankan
php artisan storage:linkpada lingkungan yang tepat jika link belum tersedia dan kebijakan hosting mengizinkannya.Jangan menimpa direktori secara sembarangan: periksa symbolic link yang sudah ada sebelum menjalankan perintah perbaikan.
Jaga permission: berikan akses minimum yang diperlukan oleh aplikasi dan web server.
Uji URL file setelah deployment: gunakan satu file uji yang memang boleh diakses publik.
Pantau error log: terutama setelah migrasi hosting, perubahan document root, atau pembaruan konfigurasi.
Lindungi file privat: gunakan disk privat atau mekanisme download terautentikasi untuk dokumen yang tidak boleh diakses siapa saja.
Jika proses deployment dilakukan berulang kali, pemeriksaan symbolic link sebaiknya menjadi bagian dari checklist agar perubahan direktori tidak menyebabkan masalah baru.
FAQ seputar Laravel storage link di hosting
1. Apakah php artisan storage:link harus dijalankan setiap kali deploy?
Tidak selalu. Perintah tersebut diperlukan ketika symbolic link belum tersedia atau perlu dibuat ulang karena perubahan struktur direktori. Jika link sudah benar dan tetap valid, kamu tidak perlu membuatnya berulang kali.
2. Kenapa storage:link berhasil tetapi gambar tetap tidak muncul?
Keberhasilan perintah hanya menunjukkan bahwa proses pembuatan link tidak melaporkan kegagalan. File sumber bisa saja tidak ada, URL bisa salah, permission tidak sesuai, atau web server membatasi akses melalui symbolic link.
3. Bagaimana cara mengatasi storage link Laravel di cPanel?
Jika SSH tersedia, masuk ke direktori utama Laravel dan jalankan perintah Artisan dari sana. Jika tidak tersedia, periksa struktur folder melalui File Manager dan hubungi penyedia hosting untuk mengetahui apakah symbolic link didukung. Pastikan lokasi link sesuai dengan document root domain.
4. Apakah folder storage Laravel harus menggunakan permission 777?
Tidak. Permission 777 memberikan akses yang terlalu luas. Hak akses harus disesuaikan dengan pengguna proses PHP, kepemilikan file, dan kebutuhan aplikasi. Masalah akses file tidak seharusnya diselesaikan dengan membuka izin tulis kepada semua pengguna.
5. Apakah file upload Laravel harus berada di public/storage?
Tidak secara fisik. Pada konfigurasi standar, file berada di storage/app/public, sedangkan public/storage menjadi symbolic link yang membuatnya dapat diakses melalui web. Disk lain, termasuk penyimpanan cloud, bisa memiliki mekanisme berbeda.
Penutup
Ketika Laravel storage link tidak berfungsi di hosting, pemeriksaan sebaiknya dimulai dari lokasi file, keberadaan symbolic link, target link, dan URL yang digunakan aplikasi. Setelah itu, periksa permission serta aturan akses web server jika file masih menghasilkan 403 atau 404.
Jangan langsung menghapus direktori, mengganti permission secara berlebihan, atau mengubah konfigurasi server tanpa bukti yang mendukung. Jika semua pemeriksaan dasar sudah dilakukan tetapi masalah belum selesai, log error dan struktur direktori hosting akan membantu mempersempit penyebabnya.
