Anda membuka situs WordPress dan yang muncul hanya tulisan singkat 403 Forbidden. Halaman depan, wp-admin, atau satu file tertentu menolak dibuka, padahal situsnya tidak down. Pada VPS Nginx, pesan ini hampir selalu berarti satu dari tiga hal: server tidak diizinkan membaca file, tidak ada file indeks yang dikenali, atau ada aturan konfigurasi yang sengaja memblokir permintaan tersebut.
Daftar Isi
- Jawaban Singkat
- Apa Artinya 403 di Nginx?
- Persiapan
- Langkah 1: Baca Log Error Nginx
- Langkah 2: Pastikan index.php Ada di Direktif index
- Langkah 3: Perbaiki Izin dan Kepemilikan File
- Langkah 4: Periksa Aturan location yang Memblokir
- Langkah 5: Singkirkan Penyebab Lain
- Verifikasi Hasil
- Troubleshooting Lanjutan
- FAQ
- Kesimpulan
- Referensi
Jawaban Singkat
Periksa log error Nginx dulu, karena 403 yang berbeda penyebabnya memberi pesan log yang berbeda. Baris directory index ... is forbidden berarti tidak ada index.php yang dikenali. Baris tentang izin file berarti kepemilikan atau mode file salah. Setelah penyebabnya jelas, perbaiki satu hal itu saja: tambahkan index.php ke direktif index, perbaiki izin menjadi 755 untuk direktori dan 644 untuk file, atau koreksi aturan location yang terlalu luas. Jangan menaikkan izin ke 777 — itu membuka file Anda untuk ditulis siapa pun di server.
Apa Artinya 403 di Nginx?
Kode 403 berarti server memahami permintaan Anda, tetapi menolak memenuhinya. Ini berbeda dengan 404 (tidak ditemukan) dan 500 (server error). Pada Nginx, 403 sering muncul dalam situasi berikut:
| Gejala | Pesan log yang umum | Kemungkinan penyebab |
|---|---|---|
| Beranda dan /wp-admin/ 403, /wp-login.php normal | directory index ... is forbidden | index.php tidak ada di direktif index |
| Satu gambar atau file CSS 403 | file permissions deny server access | Izin atau kepemilikan file salah |
| Seluruh situs 403 setelah migrasi | bervariasi | File disalin sebagai root, kepemilikan belum diperbaiki |
| Hanya wp-admin 403 | access forbidden by rule | Aturan location atau pembatasan IP yang salah |
Persiapan
- Siapkan akses SSH ke VPS dan catat jalur root situs, misalnya
/var/www/namadomain.com. - Buat backup konfigurasi Nginx dan, bila akan mengubah izin massal, backup daftar izin saat ini dengan
ls -ladi direktori situs. - Jangan mengubah izin file di luar direktori WordPress — perintah massal di jalur yang salah bisa merusak layanan lain.
Langkah 1: Baca Log Error Nginx
sudo tail -n 100 /var/log/nginx/error.log
Buka URL yang 403, lalu baca entri log terbaru pada waktu yang sama. Pesan log menunjukkan jalur file dan alasan penolakan. Tanpa langkah ini Anda hanya menebak-nebak.
Langkah 2: Pastikan index.php Ada di Direktif index
Nginx tidak membaca .htaccess, jadi aturan dari instalasi Apache lama tidak berlaku di sini. Jika beranda dan /wp-admin/ 403 tetapi /wp-login.php terbuka, penyebab klasiknya adalah baris index tanpa index.php. Periksa server block situs:
sudo nano /etc/nginx/sites-available/namadomain.com
Pastikan barisnya seperti ini:
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
Blok try_files di atas adalah pola standar WordPress di Nginx menurut dokumentasi WordPress: coba file persisnya, lalu direktori, lalu lempar ke index.php dengan query string. Setelah itu uji dan muat ulang konfigurasi:
sudo nginx -t
sudo systemctl reload nginx
Perintah nginx -t harus menyatakan sintaks OK sebelum reload; jangan me-reload konfigurasi yang gagal diuji.
Langkah 3: Perbaiki Izin dan Kepemilikan File
Patokan umum WordPress: direktori 755, file 644, dan wp-config.php lebih ketat (600 atau 640, sesuai rekomendasi host Anda). Jalankan dari direktori instalasi WordPress saja:
cd /var/www/namadomain.com
sudo find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \;
sudo chmod 600 wp-config.php
Jika file disalin sebagai root, mengubah izin saja tidak cukup: pengguna web (umumnya www-data di Ubuntu) tetap tidak bisa menulis. Perbaiki kepemilikannya:
sudo chown -R www-data:www-data /var/www/namadomain.com
Sesuaikan www-data dengan pengguna web di server Anda; periksa dulu dengan ps aux | grep nginx bila tidak yakin. Setelah itu uji kembali URL yang 403.
Langkah 4: Periksa Aturan location yang Memblokir
Aturan keamanan yang baik bisa berubah menjadi sumber 403 bila terlalu luas, misalnya blok location ~ /\. { deny all; } yang benar untuk file tersembunyi, atau blok yang menolak PHP di direktori uploads. Periksa server block untuk baris deny atau return 403, dan pastikan aturan tersebut hanya menargetkan jalur yang dimaksud. Aturan yang menolak eksekusi PHP di wp-content/uploads adalah praktik keamanan yang benar dan tidak boleh dihapus hanya karena satu file 403 — periksa dulu file apa yang sebenarnya diblokir.
Langkah 5: Singkirkan Penyebab Lain
- Plugin keamanan: nonaktifkan sementara plugin keamanan, uji, lalu aktifkan kembali. Jika 403 hilang, periksa aturan plugin tersebut, jangan membiarkannya nonaktif permanen.
- Cache dan sesi: uji di jendela privat untuk menyingkirkan cache browser lama.
- Cloudflare atau firewall: jika situs berada di belakang Cloudflare, jeda sementara proxy (mode DNS-only) untuk memastikan 403 berasal dari origin, bukan dari aturan edge.
Verifikasi Hasil
Perbaikan berhasil bila beranda, wp-admin, dan file yang sebelumnya 403 kini terbuka dengan status 200, log error tidak lagi mencatat penolakan pada URL yang sama, dan tidak ada file lain yang ikut berubah izinnya di luar direktori WordPress. Uji dari jendela privat dan, bila relevan, dari perangkat lain.
Troubleshooting Lanjutan
| Situasi | Langkah berikutnya |
|---|---|
| 403 hanya untuk satu peran pengguna | Periksa plugin keanggotaan/keamanan dan aturan location per jalur, bukan izin file global |
| 403 muncul setelah git pull atau rsync | Periksa kepemilikan: file baru sering dimiliki pengguna yang melakukan pull, bukan www-data |
| 403 hilang setelah reload lalu kembali | Cari proses deployment atau skrip yang mengatur ulang izin secara berkala |
| Semua langkah gagal | Kirim baris log persis, jalur file, dan keluaran ls -la kepada penyedia hosting |
FAQ
Apakah chmod 777 menyelesaikan 403?
Untuk sementara mungkin, tetapi itu membuat file bisa ditulis oleh semua pengguna di server — risiko keamanan serius. Gunakan 755/644 dan perbaiki kepemilikan sebagai gantinya.
Kenapa wp-login.php bisa dibuka tetapi wp-admin 403?
Karena wp-login.php adalah file, sedangkan wp-admin adalah direktori yang membutuhkan index.php. Pola ini mengarah langsung ke direktif index yang hilang.
Apakah .htaccess lama memengaruhi Nginx?
Tidak. Nginx mengabaikan .htaccess sepenuhnya. Aturan lama harus diterjemahkan ke konfigurasi server block Nginx.
Kesimpulan
403 di Nginx hampir selalu bisa dilacak dari log error: index yang hilang, izin yang salah, atau aturan yang terlalu luas. Baca log, perbaiki satu penyebab, uji, dan jangan pernah menutup masalah dengan izin 777. Bila log tidak memberi petunjuk, data log dan kepemilikan file adalah bekal terbaik untuk meminta bantuan hosting.
Referensi
- WordPress — Nginx (Advanced Administration Handbook): developer.wordpress.org — Nginx
- WordPress.org — Forum dukungan, topik 403 pada REST API: wordpress.org — Health Check 403