Artikel ini merangkum pengalaman saya upload aplikasi Laravel ke shared hosting untuk keperluan demo. Tujuannya bukan production-ready, tapi cepat online dulu. Ada dua skenario yang dibahas: menggunakan subdomain (web root bisa diatur) dan main domain (web root terkunci di public_html/).
Daftar isi
1. Checklist Sebelum Upload
- File
.env— wajib ada dan sudah dikonfigurasi. Minimal setAPP_KEY,APP_ENV=production,APP_DEBUG=false, dan koneksi database. - Folder
vendor/— harus ikut di-upload. Jalankancomposer installdi lokal dulu, lalu upload hasilnya. - APP_KEY — kalau belum ada, generate dulu di lokal dengan perintah
php artisan key:generate, lalu copy nilainya ke.envdi server. - PHP Version — pastikan versi PHP di hosting kompatibel dengan versi Laravel yang dipakai.
- Permission — folder
storage/danbootstrap/cache/harus writable (chmod 775).
APP_ENV=production dan APP_DEBUG=false agar pesan error dan konfigurasi sensitif tidak tampil di browser pengunjung.2. Skenario 1: Subdomain (Web Root Bisa Diatur)
Kalau menggunakan subdomain, panel hosting seperti cPanel biasanya mengizinkan kita mengatur web root subdomain ke folder mana saja. Ini cara yang paling bersih dan tidak perlu edit file apapun.
Upload semua file Laravel ke folder subdomain, lalu set web root-nya ke subfolder public/ lewat panel hosting. Struktur akhirnya seperti ini:
/home/username/demo.domain.web.id/
├── app/
├── bootstrap/
├── config/
├── database/
├── resources/
├── routes/
├── storage/
├── vendor/
├── .env
└── public/ ← set ini sebagai web root di panel hosting
├── index.php
└── .htaccess
index.php bawaan Laravel tidak perlu diedit — strukturnya tidak berubah sehingga path sudah otomatis benar.3. Skenario 2: Main Domain (Web Root Terkunci di public_html/)
Kalau menggunakan main domain, web root biasanya terkunci di public_html/ dan tidak bisa diubah lewat panel hosting. Solusinya adalah memisahkan file Laravel dari web root.
3.1 Struktur Folder
Upload semua file Laravel ke folder di luar public_html/, misalnya di /home/username/nama-project/. Kemudian pindahkan isi folder public/ Laravel (bukan foldernya, tapi isinya: index.php, .htaccess, favicon.ico, dll) ke public_html/. Folder public/ di dalam project Laravel setelah itu tidak perlu ada lagi.
/home/username/
├── nama-project/ ← semua file Laravel di sini
│ ├── app/
│ ├── bootstrap/
│ ├── config/
│ ├── storage/
│ ├── vendor/
│ └── .env
│ (tidak ada folder public/ lagi)
└── public_html/ ← web root main domain
├── index.php ← dari Laravel/public/, diedit pathnya
├── .htaccess ← dari Laravel/public/
├── favicon.ico
└── robots.txt
.env, config/, dan vendor/ berada di luar web root sehingga tidak bisa diakses langsung lewat browser.3.2 Edit index.php
Setelah index.php dipindah ke public_html/, edit bagian path-nya agar mengarah ke folder Laravel yang berada di luar public_html/:
require __DIR__.'/../nama-project/vendor/autoload.php'; $app = require_once __DIR__.'/../nama-project/bootstrap/app.php';
nama-project dengan nama folder Laravel kamu yang sebenarnya. Semua kode yang mengandung __DIR__ sesuaikan path-nya dengan nama-project.4. Masalah Symlink Storage
Kalau aplikasi punya fitur upload file atau menampilkan file dari storage/, Laravel butuh symlink dari folder storage di web root ke storage/app/public di folder Laravel. Normalnya ini dijalankan lewat perintah:
php artisan storage:link
Tapi di shared hosting tanpa SSH, perintah itu tidak bisa dijalankan langsung. Solusinya pakai script PHP sementara.
4.1 Jangan Upload Symlink dari Lokal
Satu hal penting: jangan ikut upload symlink yang ada di folder public/storage dari komputer lokal. Symlink lokal berisi path yang mengarah ke komputer sendiri, sehingga tidak valid di server. FTP client atau File Manager kadang mengupload symlink sebagai folder kosong atau broken link — ini harus dihapus dulu sebelum membuat symlink baru di server.
4.2 Script storage_link.php
Buat file storage_link.php, upload ke web root lewat File Manager cPanel, lalu akses sekali via browser.
Untuk Skenario 1 (subdomain) — taruh di folder public/:
<?php
$target = __DIR__ . '/../storage/app/public';
$link = __DIR__ . '/storage';
if (symlink($target, $link)) {
echo 'Storage linked successfully!';
} else {
echo 'Failed. Coba cek permission atau path.';
}
Untuk Skenario 2 (main domain) — taruh di public_html/, sesuaikan nama folder project:
<?php
$target = __DIR__ . '/../nama-project/storage/app/public';
$link = __DIR__ . '/storage';
if (symlink($target, $link)) {
echo 'Storage linked successfully!';
} else {
echo 'Failed. Coba cek permission atau path.';
}
storage_link.php dari server lewat File Manager cPanel.5. Troubleshooting
5.1 Muncul "Index of /" bukannya halaman Laravel
Ini berarti file .htaccess tidak terbaca atau belum terupload. File .htaccess adalah hidden file (diawali titik) yang sering tidak terlihat atau ter-skip saat upload.
Cara cek cepat: akses langsung https://domain.com/index.php — kalau halaman Laravel muncul, berarti index.php sudah ada tapi .htaccess-nya yang belum terupload.
Solusinya: buka File Manager di cPanel, masuk ke folder web root, lalu klik Upload dan upload ulang file .htaccess. Pastikan di File Manager aktifkan opsi Show Hidden Files agar file .htaccess terlihat setelah terupload.
Pastikan isi .htaccess-nya seperti ini (bawaan Laravel):
<IfModule mod_rewrite.c>
<IfModule mod_ssl.c>
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>
Options -Indexes
RewriteEngine On
RewriteRule ^(\.well-known/.*)$ $1 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Options -Indexes di dalam .htaccess itulah yang mencegah tampilan "Index of /" muncul saat .htaccess sudah aktif.5.2 Storage link gagal: "No such file or directory"
Berarti path $target di script tidak tepat — folder storage Laravel tidak ditemukan di lokasi yang dituju. Buat file check.php sementara untuk melihat isi folder induk:
<?php $parent = __DIR__ . '/..'; print_r(scandir($parent));
Upload ke web root lewat File Manager cPanel, akses via browser, pastikan folder storage terlihat di hasilnya. Sesuaikan path $target di script storage_link.php berdasarkan hasil ini, lalu hapus check.php setelah selesai.
5.3 Storage link gagal karena folder storage sudah ada
Symlink tidak bisa dibuat kalau nama yang sama sudah ada sebagai folder — biasanya ini sisa symlink dari lokal yang ter-upload. Hapus dulu lewat File Manager cPanel, atau pakai script ini:
<?php
// delete_storage.php — akses sekali lewat browser, lalu hapus!
function deleteDir($dir) {
if (!is_dir($dir)) return;
$items = array_diff(scandir($dir), ['.', '..']);
foreach ($items as $item) {
$path = "$dir/$item";
is_dir($path) ? deleteDir($path) : unlink($path);
}
rmdir($dir);
}
$target = __DIR__ . '/storage';
deleteDir($target);
echo 'Deleted.';
storage sudah berisi file upload dari user — backup dulu isinya sebelum dihapus.Setelah folder terhapus, jalankan lagi storage_link.php.
6. Ringkasan Langkah-Langkah
Untuk Subdomain:
- Jalankan
composer installdi lokal. - Set
.env— isiAPP_KEY, database, dan konfigurasi lainnya. - Upload semua file Laravel ke folder subdomain di hosting via File Manager cPanel.
- Set web root subdomain ke subfolder
public/lewat panel hosting. - Set permission folder
storage/danbootstrap/cache/ke 775. - Kalau ada fitur upload file: hapus folder
storagelama dipublic/, upload dan jalankanstorage_link.phpvia browser, lalu hapus scriptnya.
Untuk Main Domain:
- Jalankan
composer installdi lokal. - Set
.env— isiAPP_KEY, database, dan konfigurasi lainnya. - Upload semua file Laravel ke folder di luar
public_html/via File Manager cPanel. - Pindahkan isi folder
public/Laravel (index.php,.htaccess, dll) kepublic_html/. - Edit
public_html/index.php— sesuaikan path ke folder Laravel. - Set permission folder
storage/danbootstrap/cache/ke 775. - Kalau ada fitur upload file: hapus folder
storagelama dipublic_html/, upload dan jalankanstorage_link.phpvia browser, lalu hapus scriptnya.

Posting Komentar