Como @GeraldSchneider mencionou nos comentários, suas diretivas estão na ordem errada. Os redirecionamentos externos (HTTP para HTTPS e não-www para www) precisam ser antes do front-controller, caso contrário eles simplesmente nunca serão processados para algo diferente do arquivo real solicitações de. (Seu front-controller roteia todas as solicitações desconhecidas para index.php
e então para ).
No entanto, seus redirecionamentos também estão incorretos. Você está perdendo o "URL completo" da substituição , de modo que, na situação atual, ele sempre redirecionará de volta para a raiz do documento.
Então, tente algo como o seguinte:
RewriteEngine On
# Front-controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
# Non-www to www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
Notas sobre as diretivas acima:
- No controlador frontal, não há necessidade de capturar o caminho da URL (ou seja,
(.*)
), se não estiver sendo usado na substituição . OQSA
flag não é necessário aqui também - a string de consulta da solicitação é anexada por padrão. - Observe o
$1
naRewriteRule
susbstitution - essa é uma referência anterior ao caminho da URL capturado da solicitação (ou seja, a "URL completa"). Isso estava faltando em ambos os seus redirecionamentos. - Você estava perdendo os sinalizadores
[R=301,L]
do redirecionamento HTTP para HTTPS. Sem declarar explicitamente o código de status, isso resultaria em um redirecionamento 302 temporário e a reescrita continuaria. Se você pretende implementar o HSTS mais tarde, esses redirecionamentos precisam ser separados.
No entanto, se você tiver acesso à configuração do servidor e não pretender implementar o HSTS, consulte a resposta do @ HBruijn.