.htaccess no Apache: como funcionam redirects, cache e segurança
Um arquivo .htaccess é lido pelo Apache a cada requisição no diretório onde ele está, o que permite mudar comportamento sem reiniciar o servidor, e o módulo mod_rewrite é quem interpreta as condições e regras de redirecionamento dentro dele.
Condição, regra, e a variável %{HTTPS}
Forçar HTTPS usa duas linhas: `RewriteCond %{HTTPS} off` testa se a conexão atual não é segura, e a `RewriteRule` seguinte redireciona com o código 301 (permanente) para a mesma URL trocando o esquema para https. A flag `[L]` na regra diz ao mod_rewrite para parar de processar outras regras depois dessa, evitando que uma segunda regra reescreva o resultado de novo na mesma passada.
Remover o www usa uma `RewriteCond` que casa `^www\.(.+)$` no cabeçalho Host, capturando tudo depois do "www." em `%1`, e a regra seguinte redireciona para esse valor capturado sem o prefixo. Adicionar o www faz o caminho inverso: testa se o Host não começa com "www." e, se não começar, prefixa. As duas regras nunca convivem ativas ao mesmo tempo, porque removeriam e adicionariam o www em um ciclo sem fim.
A armadilha real acontece quando o Apache está atrás de um proxy reverso ou CDN que já encerra o TLS antes da requisição chegar até ele: nesse caso `%{HTTPS}` sempre lê "off" na origem, mesmo com o visitante acessando por https, e a regra de forçar HTTPS entra em loop de redirecionamento infinito. A correção usual é testar o cabeçalho `%{HTTP:X-Forwarded-Proto}` enviado pelo proxy em vez de `%{HTTPS}` nesse cenário específico.
Três regras, três efeitos
Forçar HTTPS ativado
Entrada
forceHttps: true
Saída esperada
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
O código 301 sinaliza redirecionamento permanente para navegadores e para o Googlebot indexar a versão https como canônica.
A flag [NC] torna a comparação do host insensível a maiúsculas e minúsculas, então "WWW.site.com" também casa com a condição.
Cache de imagem
Entrada
browserCaching: true
Saída esperada
ExpiresByType image/png "access plus 1 year"
CSS e JavaScript recebem cache de só 1 mês, e páginas HTML recebem "access plus 0 seconds" para nunca ficarem presas em cache do navegador.
FAQ da ferramenta completa
Na pasta raiz do site (normalmente public_html ou www) ou no diretório específico que você quer configurar. As regras valem para aquele diretório e seus subdiretórios. O nome do arquivo é exatamente .htaccess, com o ponto na frente e sem extensão.
Perguntas frequentes
Por que meu redirect para HTTPS entra em loop infinito?
O sintoma mais comum é o Apache estar atrás de um proxy reverso ou CDN que já entrega a conexão como HTTP para a origem depois de terminar o TLS na borda. Como `%{HTTPS}` sempre lê "off" nesse caso, a regra redireciona sem parar; o teste precisa usar `%{HTTP:X-Forwarded-Proto}` em vez de `%{HTTPS}`.
Qual a diferença entre redirect 301 e 302 no .htaccess?
301 é permanente e diz a navegadores e motores de busca para atualizarem o link salvo e transferirem o valor de SEO para a nova URL; 302 é temporário e mantém a URL antiga como referência principal, útil para manutenção ou testes que devem voltar ao normal depois.
O que a flag [L] faz numa RewriteRule?
Ela diz ao mod_rewrite para parar de aplicar outras regras depois que essa casar, na passada atual de processamento. Sem essa flag, uma regra seguinte poderia reescrever de novo uma URL que já tinha sido tratada, produzindo um resultado diferente do esperado.
Preciso do mod_headers para os cabeçalhos de segurança funcionarem?
Sim: as diretivas `Header always set` ficam dentro de um bloco `<IfModule mod_headers.c>`, então se esse módulo não estiver habilitado no Apache, o bloco inteiro é ignorado silenciosamente em vez de gerar um erro visível.