Storage Link Laravel Tidak Jalan di Server
Storage link Laravel tidak jalan di server biasanya karena php artisan storage:link belum dijalankan, document root Nginx tidak mengarah ke folder public, symlink tidak didukung hosting, permission folder salah, atau file disimpan ke disk yang berbeda. Jawaban cepatnya: cek public/storage, jalankan ulang storage:link, pastikan file ada di storage/app/public, lalu cek permission dan konfigurasi web server.
Masalah ini sering muncul setelah fitur upload berhasil di lokal, tetapi gambar menjadi 404 di production. Kodenya terlihat benar, file ada di server, namun URL /storage/... tetap tidak bisa dibuka.
Cara Kerja storage:link
Secara default, file publik Laravel disimpan di:
Browser tidak bisa mengakses folder itu langsung. Agar file publik bisa dibuka dari web, Laravel membuat symbolic link:
Perintahnya:
Setelah link dibuat, file seperti ini:
bisa diakses lewat:
Contoh Upload yang Benar
Controller:
Blade:
Bagian pentingnya adalah store('produk', 'public'). Jika disk public tidak dipakai, file bisa tersimpan di tempat yang tidak terhubung ke /storage.
Checklist Diagnosis Cepat
Masuk ke folder project di server:
Cek apakah symlink ada:
Output yang sehat biasanya mirip:
Cek file upload benar-benar ada:
Jalankan ulang link jika belum ada:
Jika link sudah ada tetapi salah, hapus link-nya lalu buat ulang:
Hati-hati: rm public/storage aman jika public/storage adalah symlink. Jangan jalankan rm -rf public/storage tanpa mengecek, karena bisa menghapus folder sungguhan jika konfigurasi server berbeda.
Cek Konfigurasi Filesystem
Di .env, pastikan disk default sesuai kebutuhan:
Lalu cek config/filesystems.php. Disk public umumnya mengarah ke storage/app/public dan punya URL /storage.
Jika kamu baru mengubah .env atau config, bersihkan cache:
Cek Nginx dan Document Root
Nginx harus mengarah ke folder public:
Jika root mengarah ke folder utama project, struktur URL bisa kacau dan file internal berisiko terekspos.
Untuk Laravel standar, konfigurasi try_files tetap diperlukan:
Setelah mengubah Nginx:
Cek Permission Folder
Laravel butuh permission menulis ke storage:
Jika upload dilakukan oleh PHP-FPM user www-data, folder storage/app/public juga harus bisa ditulis oleh user itu.
Cek user PHP-FPM:
Di beberapa server, user-nya bisa nginx, www-data, atau user deploy khusus. Sesuaikan perintah chown dengan server kamu.
Jika Hosting Tidak Mendukung Symlink
Beberapa shared hosting membatasi symbolic link. Jika php artisan storage:link gagal atau link tidak bisa dibaca web server, opsi yang lebih aman adalah:
- gunakan VPS yang mendukung symlink,
- tanyakan ke provider hosting apakah symlink diizinkan,
- simpan file publik langsung di disk yang memang diarahkan ke public path,
- gunakan object storage seperti S3-compatible storage untuk project yang lebih serius.
Untuk pemula yang belajar production, VPS biasanya lebih mudah diprediksi daripada shared hosting yang banyak batasannya.
Kesalahan yang Sering Terjadi
Menyimpan File Tanpa Disk public
Kode ini menyimpan ke disk default:
Jika disk default bukan public, file tidak akan muncul di URL /storage.
Gunakan:
Menyimpan Path Lengkap ke Database
Jangan simpan URL penuh jika tidak perlu:
Lebih fleksibel simpan path relatif:
Lalu bentuk URL di Blade:
Lupa Jalankan storage:link Setelah Deploy Baru
Saat clone project baru di server, symlink tidak otomatis ada. Masukkan ini ke checklist deploy:
Permission Diselesaikan dengan chmod 777
chmod 777 terlihat cepat, tetapi terlalu longgar. Lebih baik benahi owner dan group folder.
APP_URL Masih Localhost
Jika URL file dibuat dari config dan APP_URL masih localhost, link bisa mengarah ke domain salah. Perbaiki .env production.
Pencegahan
- Selalu gunakan disk
publicuntuk file yang memang boleh diakses browser. - Simpan path relatif di database.
- Jalankan
php artisan storage:linksaat deploy awal. - Pastikan Nginx root mengarah ke folder
public. - Atur permission
storagedanbootstrap/cache. - Jangan memakai
chmod 777sebagai solusi permanen. - Masukkan upload file ke checklist smoke test setelah deploy.
Bacaan Terkait
- Cara Deploy Laravel ke VPS
- Setup Nginx + PHP-FPM untuk Laravel
- Laravel
.envProduction: Checklist Aman - Upload File PHP Gagal? 7 Penyebab Umum
- Otentikasi Laravel
Referensi Resmi
FAQ
Kenapa gambar upload 404 di server?
Biasanya karena public/storage belum ada, file tidak disimpan ke disk public, Nginx root salah, atau permission folder tidak cocok.
Apakah php artisan storage:link perlu dijalankan setiap deploy?
Tidak selalu. Biasanya cukup saat deploy pertama atau saat symlink hilang. Tetapi aman memasukkannya ke checklist deploy karena perintah ini cepat memberi tahu jika link sudah ada.
Bolehkah folder storage dijadikan public root?
Jangan. Laravel hanya mengekspos bagian yang memang publik lewat public/storage. Folder storage juga berisi log, cache, dan file lain yang tidak untuk browser.
Apa bedanya Storage::url() dan asset('storage/...')?
Storage::url($path) membuat URL berdasarkan konfigurasi disk. asset('storage/' . $path) membuat URL dari path public. Untuk project sederhana dengan disk public, keduanya bisa dipakai asal path-nya konsisten.
Bagaimana kalau file ada tetapi tetap tidak bisa dibuka?
Cek permission file, owner folder, root Nginx, dan apakah public/storage benar-benar symlink ke storage/app/public.