Cara Mengatasi WordPress 403 Forbidden di VPS Nginx: Izin File dan Konfigurasi

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.

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:

GejalaPesan log yang umumKemungkinan penyebab
Beranda dan /wp-admin/ 403, /wp-login.php normaldirectory index ... is forbiddenindex.php tidak ada di direktif index
Satu gambar atau file CSS 403file permissions deny server accessIzin atau kepemilikan file salah
Seluruh situs 403 setelah migrasibervariasiFile disalin sebagai root, kepemilikan belum diperbaiki
Hanya wp-admin 403access forbidden by ruleAturan 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 -la di 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

SituasiLangkah berikutnya
403 hanya untuk satu peran penggunaPeriksa plugin keanggotaan/keamanan dan aturan location per jalur, bukan izin file global
403 muncul setelah git pull atau rsyncPeriksa kepemilikan: file baru sering dimiliki pengguna yang melakukan pull, bukan www-data
403 hilang setelah reload lalu kembaliCari proses deployment atau skrip yang mengatur ulang izin secara berkala
Semua langkah gagalKirim 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

Cookie Consent