RewriteEngine On

# No mostrar index.php en la URL
RewriteCond %{THE_REQUEST} \s/+(.*/)?index\.php(?:[?\s]|/)(?:.*)$ [NC]
RewriteRule ^index\.php$ ./ [R=301,L]

# No permitir acceso directo a /public
RewriteRule ^public(?:/.*)?$ ./ [R=301,L]

# Si el archivo o carpeta existe físicamente, cargarlo normalmente
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Todas las demás peticiones pasan por el controlador principal
RewriteRule ^ index.php [QSA,L]