Nginx 403 Forbidden hatası: nedenleri ve çözümü

Nginx ve Web Sunucusu 64 görüntülenme Markdown

Nginx'in 403 Forbidden vermesi, sunucunun isteğinizi anladığını ama o kaynağa erişmenize izin vermediğini söyler. Bu, 404 (bulunamadı) hatasından farklıdır: kaynak büyük olasılıkla vardır, Nginx onu sunamamaktadır. Sebebi her zaman error.log'da yazar; tahmin etmeden önce oraya bakın.

sudo tail -n 20 /var/log/nginx/error.log

Günlük mesajına göre çözüm

1. directory index of "/var/www/ornek.com/" is forbidden

Klasörde varsayılan bir sayfa yok ve Nginx'te dizin listeleme kapalı. Siteniz için index.html ya da index.php gibi bir dosya koyun, ya da ayarda index satırının doğru dosya adlarını içerdiğinden emin olun (index index.php index.html;). PHP sitelerinde index.php'nin listede olması gerekir. Dizin listelemeyi bilerek açmak isterseniz (yalnızca dosya paylaşımı klasörleri için) autoindex on; kullanabilirsiniz.

2. open() "/var/www/ornek.com/index.html" failed (13: Permission denied)

Nginx dosyayı okuyamıyor. Üç kontrol:

  1. Nginx hangi kullanıcıyla çalışıyor? ps aux | grep "nginx: worker" (genelde www-data).
  2. Dosya ve klasör izinleri: dosyalar en az 644, klasörler 755 olmalı. Önemli olan, yolun üzerindeki her klasörün (/var, /var/www, /var/www/ornek.com) çalıştırma (x) iznine sahip olmasıdır. namei -l /var/www/ornek.com/index.html komutu yoldaki tüm izinleri sırayla gösterir ve nerede takıldığını ortaya çıkarır.
  3. Siteyi bir ev dizininde (/home/ali/site) tutuyorsanız ev dizini varsayılan olarak başkalarına kapalıdır. Siteyi /var/www altına taşıyın ya da ev dizinine Nginx kullanıcısı için izin verin.

Düzeltme örneği:

sudo chown -R www-data:www-data /var/www/ornek.com
sudo find /var/www/ornek.com -type d -exec chmod 755 {} \;
sudo find /var/www/ornek.com -type f -exec chmod 644 {} \;

3. access forbidden by rule

Ayar dosyasında bir deny kuralı sizin adresinizi ya da yolu engelliyor. sudo nginx -T | grep -n -E "deny|allow" ile tanımlı kuralları arayın. Örneğin location ~ /\. gibi gizli dosyaları engelleyen bir kural, /.well-known/ klasörünü de engelliyorsa Let's Encrypt doğrulaması 403 alır: kuralı location ~ /\.(?!well-known) biçiminde yazın.

4. SELinux ya da AppArmor (AlmaLinux gibi sistemlerde) dosya erişimini bağlam yüzünden engelleyebilir. Ubuntu ve Debian şablonlarımızda varsayılan olarak bu sorun yoktur.

PHP dosyaları için ek kontrol

PHP dosyası 403 veriyorsa ayarda location ~ \.php$ bloğu yoksa ya da fastcgi_pass yanlışsa 403/404 görürsünüz. PHP-FPM çalışıyor mu bakın: 502 makalesi. Gizli dosyaları kapatan kuralı kasıtlı koyduysanız (.env, .git gibi), bu dosyalara erişimde 403 almanız doğru davranıştır.

Hosting paketinde

Hosting'de Nginx ayarı sizde değildir; 403 genellikle ana klasörde index.html ya da index.php olmaması ya da dosya izinlerinin hatalı olmasındandır: hosting'de 403, 404, 500.

Sık sorulanlar

403 ile 404 arasındaki fark ne?

404 aradığınız kaynağın bulunamadığını, 403 bulunup erişime izin verilmediğini ifade eder. Ama bir klasör için index dosyası eksikse Nginx 403 verir; bu yüzden bir sayfanın hiç var olmadığı durumda da 403 görebilirsiniz.

İzinleri 777 yapsam düzelir mi?

Bazen düzelir ama güvenlik açığı yaratır. Doğru sahip ve 755/644 kullanın.

Sadece belirli IP'ler için 403 veriyor.

Ayarınızda allow ve deny kuralları var. Bir deny all; öncesinde izin vereceğiniz adresleri allow ile tanımladığınızdan emin olun.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.