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.

Ein 403 auf wp-admin nach einem Plugin-Update ist meist ein Sicherheits-Plugin, das einen Pfad sperrt, den es für angegriffen hält. Sein Log sagt das, und es per Umbenennen des Verzeichnisses abzuschalten ist der schnellste Weg zur Bestätigung.