Regras prontas de htaccess para forçar HTTPS no site todo menos uma pasta, ou mandar HTTPS para HTTP com exceção, e os cuidados de cada caso.
Às vezes você precisa que uma pasta do site se comporte diferente do resto: um sistema antigo que só funciona em HTTP, uma API chamada por um equipamento que não fala HTTPS, ou o contrário, só a área de login e pagamento com HTTPS obrigatório. Tudo isso se resolve com RewriteCond no arquivo .htaccess da raiz do site.
Antes de começar
- Faça uma cópia do
.htaccessatual. No Gerenciador de Arquivos do cPanel, ative Show Hidden Files (dotfiles) em Settings para enxergá-lo. - Teste com redirecionamento temporário. Nos exemplos abaixo, use
R=302enquanto testa e só troque paraR=301quando estiver tudo certo. O navegador guarda o 301 em cache e um erro de regra fica "grudado" até você limpar o cache. - Em WordPress, coloque as regras acima da linha
# BEGIN WordPress.
Forçar HTTPS no site inteiro, exceto uma pasta
É o caso mais comum hoje. Troque pasta-livre pelo nome da sua pasta:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/pasta-livre/ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Leitura da regra: se o acesso chegou sem HTTPS e o endereço não começa com /pasta-livre/, redirecione para a mesma página em HTTPS. Quem acessa http://seudominio.com.br/pasta-livre/ continua em HTTP.
Para liberar mais de uma pasta, acrescente uma linha RewriteCond para cada uma, ou junte numa só:
RewriteCond %{REQUEST_URI} !^/(pasta-livre|api-antiga|\.well-known)/ [NC]
O \.well-known do exemplo é a pasta usada na validação de certificados SSL. Deixá-la fora de qualquer redirecionamento evita surpresa na renovação automática.
Redirecionar HTTPS para HTTP, exceto uma pasta
É o pedido original deste artigo, comum em sites antigos. A regra é o espelho da anterior:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/loja/ [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Tudo o que chegar em HTTPS volta para HTTP, menos o que estiver em /loja/.
Só uma pasta em HTTPS e o resto em HTTP
Quando a área de login ou de pagamento precisa de HTTPS e o restante do site ainda não está pronto, são duas regras: uma empurra a pasta para HTTPS e a outra tira o resto.
RewriteEngine On
# /area-segura/ sempre em HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/area-segura/ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# o resto do site em HTTP
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/area-segura/ [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Cuidado com imagens, CSS e scripts que a pasta segura carrega de fora dela: se vierem por HTTP, o navegador acusa conteúdo misto. Pastas como /css/, /js/ e /imagens/ podem precisar entrar na exceção da segunda regra.
Problemas comuns
ERR_TOO_MANY_REDIRECTS
Uma regra manda para HTTPS e outra (no cPanel, num plugin ou na Cloudflare) manda de volta. Desligue o Force HTTPS Redirect do domínio no cPanel quando for usar exceções no .htaccess, e se o site usa Cloudflare, não use o modo SSL Flexible.
A exceção não pega
Confira a barra e as maiúsculas: ^/Loja/ é diferente de ^/loja/ sem o [NC], e ^/loja/ não casa com /loja sem a barra final. Para aceitar as duas formas, use ^/loja(/|$).
Continuo sendo redirecionado mesmo depois de apagar a regra
É o cache do 301 no navegador. Teste numa janela anônima ou limpe o cache.