Ein 403 unterscheidet sich von einem 404 auf nützliche Weise: Der Server hat gefunden, wonach Sie gefragt haben. Dann hat etwas Nein gesagt. Das grenzt es auf vier Dinge ein.
1. Es gibt keine Index-Datei
Eine Anfrage an ein Verzeichnis ohne index.php oder index.html, bei abgeschaltetem Verzeichnislisting, ergibt 403. Das ist korrektes Verhalten und heißt meist, dass ein Deploy nicht fertig wurde.
ls -la /var/www/site/
2. Der Server kann sie nicht lesen
Eine Datei, die der Web-Benutzer nicht lesen kann, wird abgewiesen. Prüfen Sie den Eigentümer ebenso wie die Rechte — die Rechte stimmen weit häufiger als der Eigentümer.
namei -l /var/www/site/index.php
namei geht den ganzen Pfad ab und zeigt die Rechte auf jeder Ebene. Ein Verzeichnis in der Mitte ohne Execute-Bit sperrt alles darunter — und genau das übersieht man.
3. Eine Regel verweigert sie
grep -rn "deny\|Require all denied" /etc/nginx/sites-enabled/ .htaccess 2>/dev/null
Sicherheitsregeln, die nach Endung oder Verzeichnis sperren, sind die gewollte Art von 403. Fängt sie Ihre eigene Datei, ist die Regel zu weit gefasst.
4. Eine Firewall oder WAF
Kommt der 403 mit einer Seite, die nicht Ihre ist, stammt er von etwas vor dem Server. Dessen eigenes Log nennt die zutreffende Regel.