Nginx 403 Forbidden hatası: nedenleri ve çözümü
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:
- Nginx hangi kullanıcıyla çalışıyor?
ps aux | grep "nginx: worker"(geneldewww-data). - 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.htmlkomutu yoldaki tüm izinleri sırayla gösterir ve nerede takıldığını ortaya çıkarır. - Siteyi bir ev dizininde (
/home/ali/site) tutuyorsanız ev dizini varsayılan olarak başkalarına kapalıdır. Siteyi/var/wwwaltı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
- Nginx ile tek sunucuda birden fazla web sitesi (server block)
- Hosting'de sitem 403, 404 veya 500 hatası veriyor
- Nginx 502 Bad Gateway hatası: nedenleri ve çözümü
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.
Geri bildiriminiz için teşekkürler!