Sim, o sinalizador L
( last
) é necessário para esses redirecionamentos externos (canônicos) . "Encadeamento" não entra realmente nisso - são redirecionamentos externos - você deseja que o processamento pare o mais rápido possível e envie a resposta de redirecionamento de volta ao cliente. Se você não incluiu o L
, o processamento continuará no arquivo e será reescrito para o seu front controller antes do redirecionamento ocorrer - o que é certamente o que você não quer que aconteça (como provavelmente resultará em um redirecionamento externo para /index.php?redirectroot=....
).
Na verdade, suas diretivas estão na ordem errada. Como regra geral, redirecionamentos externos devem sempre vir antes de reescrever internos . Seus redirecionamentos canônicos (www e HTTPS) devem estar juntos, perto do topo do arquivo, não no final.
Além disso, seu redirecionamento de www para não-www redireciona para http://
, que está em conflito direto com seu redirecionamento HTTP para HTTPS, o que criará um loop desnecessário.
Seu redirecionamento HTTP para HTTPS também é inválido, pois você está perdendo um espaço antes dos RewriteRule
flags.
Então, em resumo:
RewriteEngine On
# remove www.
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#direct favicon requests to img directory
RewriteCond %{REQUEST_URI} !^/img/favicon.ico
RewriteRule favicon\.ico /img/favicon.ico [NC,L]
#Rules for Versioned Static Files - remove timestamp
RewriteRule ^(js|js-common|css|css-common|img|img-common)/(.+)\.([0-9])+\.(js|css|php|jpg|gif|png)(.*)$ $1/$2.$4$5 [L]
#rename invalid file and directory requests
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?redirectroot=%{REQUEST_URI}
Ao incluir seu redirecionamento www para não www antes do redirecionamento HTTPS e redirecionando para o canonical https://
, você evita dois redirecionamentos em potencial.
O sinalizador QSA
não é necessário, a menos que você inclua explicitamente uma string de consulta na substituição e deseje mesclar isso com a string de consulta na solicitação. (Você não está incluindo uma string de consulta no redirecionamento www para não-www, então este sinalizador não é necessário.)
Eu mudei o seu redirecionamento para o /img/favicon.ico
para uma reescrita interna . Não tem certeza porque você deseja redirecionar aqui? Eu também questionaria o uso do NC
flag aqui. Você só deve tornar a partida insensível a maiúsculas e minúsculas se isso for especificamente necessário.
Além disso, removi o sinalizador NC
da diretiva negada RewriteCond
. Pense na lógica.
I know
[L]
directive will cause an.htaccess
loop
Em um contexto .htaccess
(diretório), o L
sinalizador finaliza a passagem atual através do arquivo .htaccess
. No entanto, o processamento realmente "loop", até que a solicitação passe inalterada - exceto no caso de um redirecionamento externo ( R=3xx
), que é acionado imediatamente.