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
RedirectMatch
andRewriteRule
failed
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.