RewriteEngine On

# Interdit tout accès direct à /public ou à l'un de ses sous-dossiers.
RewriteCond %{REQUEST_URI} ^/public(?:/|$)
RewriteRule ^ - [R=404,L]

# Redirige toutes les requêtes vers le dossier /public, en conservant le chemin demandé.
# Attention, si l'application est installée dans un sous-dossier (ex. : http://localhost/mon-projet/),
# il faut adapter ce chemin en conséquence, par exemple :
# RewriteRule ^(.*)$ /mon-projet/public/$1 [L]
# Sans cette adaptation, la redirection pointera vers une mauvaise URL et l'application ne fonctionnera pas.
RewriteRule ^(.*)$ public/$1 [L]