Para evitar um loop de redirecionamento, é necessário diferenciar entre uma solicitação direta para o subdiretório /public e uma solicitação que tenha sido reescrita internamente para o subdiretório /public (que é o seu diretiva acima faz).
Existem várias maneiras de fazer isso. Uma maneira é verificar a variável THE_REQUEST server, que contém o cabeçalho da solicitação inicial (por exemplo, GET /public/whatever HTTP/1.1 ) enviada do cliente e não é alterada quando a URL é regravada.
Tente o seguinte ... como regra geral, os redirecionamentos externos devem ser executados antes das reescritas internas, portanto, a regra a seguir deve estar próxima à parte superior do arquivo .htaccess no subdiretório /public (não no arquivo .htaccess na raiz do documento):
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /public
RewriteRule (.*) /$1 [R=302,L]
Para qualquer solicitação direta que inicie /public/<whatever> , redirecione para /<whatever> . A diretiva RewriteCond anterior garante que apenas as solicitações diretas sejam processadas.
A diretiva RewriteRule pode parecer um pouco estranha no início (como se talvez redirecionasse para si mesma), mas isso ocorre porque o padrão RewriteRule corresponde ao caminho da URL menos o prefixo de diretório de onde o arquivo .htaccess está localizado. Assim, dada uma solicitação para /public/<whatever> , a referência de referência $1 captura apenas <whatever> . Então redireciona de volta para /<whatever> .
Observe que este é atualmente um redirecionamento temporário (302). Altere isso para um 301 somente quando tiver certeza de que está funcionando OK. 301s são armazenados em cache pelo navegador, portanto, pode tornar o teste problemático se houver um erro.
mixing
RedirectMatchandRewriteRulefailed
Como as diretivas pertencem a módulos diferentes (mod_alias vs mod_rewrite), elas são executadas em momentos diferentes durante a requisição, independente da ordem aparente no arquivo de configuração (o mod_rewrite geralmente é executado primeiro). Portanto, misturar essas diretivas pode resultar em conflitos. No entanto, RedirectMatch não fornece o controle necessário nessa instância.