Un 403 se distingue de un 404 de forma útil: el servidor encontró lo que pediste. Luego algo dijo que no. Eso lo reduce a cuatro cosas.

1. No hay archivo de índice

Una petición a un directorio sin index.php ni index.html, con el listado desactivado, da un 403. Es el comportamiento correcto y suele significar que un despliegue no terminó.

ls -la /var/www/site/

2. El servidor no puede leerlo

Un archivo que el usuario web no puede leer se rechaza. Comprueba el propietario tanto como los permisos: los permisos están bien mucho más a menudo que el propietario.

namei -l /var/www/site/index.php

namei recorre la ruta entera e imprime los permisos en cada nivel. Un directorio a mitad de camino sin bit de ejecución bloquea todo lo que hay debajo, y ese es el caso que se pasa por alto.

3. Una regla lo está denegando

grep -rn "deny\|Require all denied" /etc/nginx/sites-enabled/ .htaccess 2>/dev/null

Las reglas de seguridad que deniegan por extensión o por directorio son el 403 buscado. Si lo que cae en la red es tu propio archivo, la regla es demasiado amplia.

4. Un cortafuegos o un WAF

Si el 403 llega con una página que no es la tuya, viene de algo que está delante del servidor. Su propio registro nombra la regla que coincidió.

Un 403 en wp-admin tras actualizar un plugin suele ser un plugin de seguridad bloqueando una ruta que cree atacada. Su registro lo dirá, y desactivarlo renombrando su directorio es la forma más rápida de confirmarlo.