Nginx 403 Forbidden Padahal Permission Sudah Benar: Cara Diagnosis dan Memperbaikinya
Server Solusi – Website yang tiba-tiba menampilkan 403 Forbidden bisa cukup membingungkan, terutama ketika permission file sudah terlihat benar. File memiliki izin baca, direktori terlihat bisa diakses, tetapi Nginx tetap menolak permintaan.
Dalam kondisi seperti ini, saya tidak menyarankan kamu langsung menjalankan chmod atau chown berulang kali. Status HTTP 403 tidak selalu disebabkan oleh permission Linux. Konfigurasi root, file index yang tidak tersedia, aturan deny, symlink, atau kebijakan keamanan tambahan juga bisa menyebabkan masalah serupa.
Karena belum ada log error dan konfigurasi server yang diberikan, panduan ini menggunakan skenario troubleshooting umum pada Linux dengan Nginx. Penyebab pastinya perlu ditentukan berdasarkan hasil pemeriksaan server kamu.
Mengapa Nginx Tetap Menghasilkan 403?
Jika Nginx menampilkan 403 Forbidden padahal permission sudah benar, periksa terlebih dahulu error log, document root, file index, dan aturan akses pada konfigurasi virtual host.
Jika log menunjukkan directory index of ... is forbidden, kemungkinan Nginx menemukan direktori yang diminta tetapi tidak menemukan file index yang sesuai, sementara directory listing tidak diizinkan. Jika log menunjukkan access forbidden by rule, periksa aturan pembatasan akses. Jika muncul Permission denied, telusuri permission seluruh direktori induk, ACL, symlink, dan kebijakan keamanan sistem.
Kuncinya adalah membedakan jenis penolakan akses sebelum mengubah konfigurasi. Setiap pesan tersebut mengarah pada jalur diagnosis yang berbeda.
Gejala dan Kemungkinan Penyebab
Pesan di error.log dapat membantu membedakan penyebab 403. Beberapa contoh berikut merupakan ilustrasi pesan yang mungkin ditemukan, bukan log dari server yang sudah diuji.
| Pesan atau kondisi | Hal yang perlu diperiksa |
|---|---|
directory index of ... is forbidden | File index dan pengaturan directory listing |
access forbidden by rule | Direktif deny, allow, atau aturan akses lain |
Permission denied | Direktori induk, ACL, SELinux, atau AppArmor |
| Hanya satu domain yang mengalami 403 | Virtual host, root, alias, dan konfigurasi domain |
| Hanya URL tertentu yang gagal | Blok location, aturan akses, atau pemetaan URI |
1. File index tidak ditemukan
Ketika pengunjung membuka halaman utama seperti https://example.com/, Nginx perlu menentukan file yang akan disajikan. Secara default, direktif index menggunakan index.html, kecuali konfigurasi menentukan nama lain.

Jika file index tidak tersedia dan directory listing tidak diaktifkan, Nginx dapat menghasilkan 403. Ini berbeda dari kondisi ketika file index tersedia tetapi tidak dapat dibaca.
2. Direktif deny membatasi akses
Konfigurasi seperti berikut akan menolak permintaan yang cocok dengan aturan tersebut:
location /private/ {deny all;}Permission file tidak akan mengubah keputusan aturan ini. Modul akses Nginx mendukung pembatasan berdasarkan alamat IP dan aturan akses lain. Urutan allow dan deny juga penting karena aturan diperiksa berdasarkan kecocokan.
3. Document root atau alias tidak sesuai
Nginx dapat memetakan URL ke lokasi file yang berbeda dari perkiraanmu. Contohnya, konfigurasi root dan alias memiliki mekanisme pemetaan path yang berbeda.
Jika kamu baru memindahkan website atau mengubah konfigurasi virtual host, pastikan path yang diperiksa benar-benar merupakan path yang digunakan untuk permintaan tersebut.
4. Symlink mengarah ke lokasi yang dibatasi
Website terkadang menggunakan symbolic link untuk menghubungkan document root dengan direktori lain. Walaupun target symlink memiliki permission yang terlihat benar, direktori induk atau kebijakan keamanan pada lokasi target tetap dapat membatasi akses.
Periksa target symlink dan path lengkapnya sebelum mengubah ownership atau permission.
Langkah Diagnosis dan Perbaikan
Langkah 1: Ambil log terbaru ketika 403 terjadi
Pada Ubuntu atau Debian dengan instalasi Nginx standar, jalankan:
sudo tail -n 100 /var/log/nginx/error.logJika log tidak tersedia pada lokasi tersebut, periksa direktif error_log di konfigurasi aktif atau log service:
sudo journalctl -u nginx -n 100 --no-pagerAkses kembali URL yang bermasalah setelah mulai memantau log. Perhatikan pesan baru yang muncul pada waktu permintaan tersebut.
Tindakan berikutnya: jika log menyebut directory index, lanjutkan ke pemeriksaan index. Jika menyebut access forbidden by rule, periksa aturan akses. Jika menunjukkan Permission denied, telusuri akses file dan kebijakan keamanan sistem.
Jangan menyimpulkan penyebab hanya dari status 403 di browser.
Langkah 2: Pastikan document root yang digunakan
Tampilkan konfigurasi Nginx yang aktif:
sudo nginx -T 2>&1Cari blok server yang sesuai dengan domain kamu, lalu periksa direktif berikut jika ada:

server_name example.com;root /var/www/example.com/public;index index.html index.htm;Contoh tersebut bukan konfigurasi yang harus langsung disalin ke server. Gunakan sebagai acuan untuk memahami hubungan antara domain, document root, dan nama file index.
Pastikan juga kamu memeriksa blok HTTPS yang benar jika masalah hanya muncul pada koneksi HTTPS. Satu domain bisa memiliki blok server berbeda untuk port 80 dan 443.
Langkah 3: Periksa keberadaan file index
Jika konfigurasi menunjukkan document root /var/www/example.com/public, periksa isinya:
ls -la /var/www/example.com/public/Periksa apakah file yang disebut dalam direktif index benar-benar tersedia. Pada aplikasi PHP, file index mungkin berupa index.php, bukan index.html.
Jika aplikasi memang menggunakan PHP, pastikan konfigurasi PHP-FPM dan pemrosesan FastCGI sesuai. Menambahkan index.php ke daftar index saja tidak cukup jika Nginx belum dikonfigurasi untuk meneruskan file PHP ke PHP-FPM.
Jika file index tidak tersedia, pulihkan file yang seharusnya ada atau koreksi document root. Jangan membuat file kosong hanya untuk menghilangkan 403 karena tindakan itu belum tentu memperbaiki website.
Langkah 4: Periksa aturan akses pada virtual host
Cari aturan akses yang mungkin membatasi URL:
sudo nginx -T 2>&1 | grep -nE 'deny|allow|auth_request|auth_basic'Perintah ini membantu menemukan beberapa direktif terkait, tetapi hasilnya tidak menunjukkan seluruh konteks konfigurasi secara otomatis. Periksa blok server dan location di sekitar baris yang ditemukan.
Jika terdapat aturan seperti deny all, tentukan apakah pembatasan tersebut memang disengaja. Jangan menghapusnya begitu saja, terutama jika aturan itu melindungi direktori sensitif.
Jika akses seharusnya hanya diizinkan dari alamat IP tertentu, sesuaikan daftar akses dengan kebutuhan. Setelah mengubah konfigurasi, uji sintaks sebelum menerapkan perubahan.
Langkah 5: Telusuri permission jika log menunjukkan penolakan akses
Jalankan pemeriksaan berikut dengan path yang benar-benar tercantum di log:
namei -l /var/www/example.com/public/index.htmlPeriksa setiap direktori pada path tersebut. Jika semua permission Unix tampak sesuai, lanjutkan ke ACL:

getfacl /var/www/example.com/public/index.htmlJika server menggunakan SELinux, periksa statusnya dan cari penolakan yang relevan:
getenforcesudo ausearch -m AVC -ts recentPerintah ausearch memerlukan utilitas audit yang sesuai dan relevan terutama pada sistem yang menggunakan SELinux. Jika sistem menggunakan AppArmor, periksa log kernel untuk pesan penolakan profil terkait.
Jangan mengubah permission atau menonaktifkan mekanisme keamanan sebelum ditemukan bukti bahwa lapisan tersebut menyebabkan masalah.
Langkah 6: Periksa konfigurasi symlink jika digunakan
Untuk memeriksa apakah sebuah path merupakan symbolic link, gunakan:
ls -ld /var/www/example.com/publicreadlink -f /var/www/example.com/publicreadlink -f membantu menunjukkan lokasi target yang diselesaikan, jika target dapat ditemukan.
Jika document root mengarah ke direktori lain, ulangi pemeriksaan permission pada lokasi target dan direktori induknya. Periksa juga apakah konfigurasi root atau alias memetakan URL ke lokasi yang berbeda.
Jika server menggunakan direktori khusus dari panel hosting, jangan mengubah kepemilikan target tanpa memahami struktur akses yang diterapkan panel tersebut.
Verifikasi Setelah Perbaikan
Setelah melakukan perubahan yang sesuai dengan hasil diagnosis, lakukan pengujian dari sisi server.
1. Uji status HTTP
curl -I https://example.com/Ganti domain dengan website yang diperiksa. Respons 200 OK merupakan hasil yang diharapkan jika endpoint memang seharusnya mengembalikan halaman normal dengan status 200.
Jika respons masih 403, periksa URL yang tepat dan lihat apakah log menunjukkan penyebab yang sama atau masalah baru.
2. Validasi konfigurasi
Jika kamu mengubah konfigurasi Nginx, jalankan:
sudo nginx -tJika pengujian berhasil, terapkan perubahan konfigurasi dengan reload:
sudo systemctl reload nginxPerubahan permission file biasanya tidak membutuhkan reload. Jangan menjalankan reload jika validasi konfigurasi gagal.
3. Periksa log terbaru dan halaman terkait
sudo tail -n 50 /var/log/nginx/error.logUji kembali URL yang sebelumnya gagal, termasuk halaman atau file lain yang terdampak. Pastikan tidak ada pesan penolakan akses baru pada permintaan tersebut.
Status service yang aktif tidak otomatis membuktikan semua URL sudah berfungsi. Verifikasi harus mencakup endpoint yang memang bermasalah.

Pencegahan agar Error 403 Tidak Terulang
Simpan salinan konfigurasi virtual host sebelum mengubah
root,alias,index, atau aturan akses.Periksa konfigurasi aktif setelah deployment atau pemindahan website.
Pastikan file index yang dibutuhkan aplikasi tersedia di document root yang benar.
Dokumentasikan aturan
allowdandeny, khususnya untuk direktori privat.Hindari
chmod 777dan perubahan ownership rekursif tanpa diagnosis.Pantau error log setelah perubahan konfigurasi atau pembaruan aplikasi.
Jika menggunakan SELinux atau AppArmor, pertahankan kebijakan keamanan dan dokumentasikan setiap perubahan yang dilakukan.
FAQ
Apakah Nginx 403 Forbidden selalu disebabkan permission file?
Tidak. Status 403 juga dapat disebabkan oleh file index yang tidak tersedia, directory listing yang dinonaktifkan, aturan akses Nginx, atau kebijakan keamanan sistem. Error log membantu membedakan penyebab tersebut.
Mengapa halaman utama 403 tetapi file HTML lain bisa dibuka?
Salah satu kemungkinan adalah file index tidak tersedia atau tidak tercantum dalam direktif index. Periksa document root dan nama file index sebelum mengubah permission.
Apakah chmod 755 bisa mengatasi Nginx 403?
Hanya jika penyebabnya memang berkaitan dengan permission direktori dan pola tersebut sesuai dengan kebutuhan akses. Jika 403 berasal dari deny all atau file index yang tidak ditemukan, chmod 755 tidak akan menyelesaikan penyebab utamanya.
Bagaimana mengetahui apakah 403 berasal dari aturan deny Nginx?
Periksa error log untuk pesan seperti access forbidden by rule, lalu periksa direktif allow dan deny pada konfigurasi virtual host dan blok location terkait.
Apakah saya harus restart Nginx setelah memperbaiki 403?
Tidak selalu. Perubahan permission file biasanya langsung berlaku. Jika kamu mengubah konfigurasi, jalankan nginx -t terlebih dahulu lalu gunakan reload apabila validasi berhasil.
Penutup
Ketika Nginx menghasilkan 403 Forbidden meskipun permission sudah benar, jangan terpaku pada chmod dan chown. Mulailah dengan membaca error log, memastikan document root, memeriksa file index, dan menelusuri aturan akses yang aktif.
Jika semua pemeriksaan tersebut tidak menemukan penyebabnya, lanjutkan ke ACL, symlink, SELinux, atau AppArmor sesuai lingkungan server. Dengan mengikuti petunjuk dari log dan memverifikasi setiap perubahan, kamu dapat mempersempit sumber masalah tanpa membuka akses file secara berlebihan.
