RewriteRule ^(.*)$ /public/$1 [L]
Você só precisa de uma condição adicional para evitar um loop de reescrita. Por exemplo:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /public/$1 [L]
A variável de ambiente REDIRECT_STATUS
está vazia na solicitação inicial e é definida como 200 (OK) após a primeira reescrita bem-sucedida.
As âncoras inicial / final ( ^
e $
) não são necessárias, pois a regex é gulosa por padrão.