Como funciona esta verificação
O Scanaris pede a tua página por http://, sem o s, sem seguir redirecionamentos, e vê o que o servidor responde. Se devolve um código de redirecionamento (301, 302, 307 ou 308) para um URL https://, está tudo bem. Se responde 200 e serve a página em claro, abre um achado de severidade média: a versão sem cifragem do teu site existe e funciona. Se redireciona mas o destino continua a ser http:// (por exemplo, da raiz para http://www), abre um de severidade baixa: a cadeia de redirecionamentos tem um elo sem cifragem. Só se testa o URL analisado; convém que o comportamento seja o mesmo em todas as rotas, não só na página inicial.
Porque importa
Enquanto existir uma versão HTTP que responde, qualquer link antigo, qualquer endereço escrito à mão e qualquer rede pública podem levar o utilizador ao teu site sem cifragem. Nesse estado, quem controla a rede (o wifi do aeroporto, um fornecedor malicioso) lê o que é enviado e pode modificar a página antes de chegar. É a base dos ataques de intermediário. Um 301 para HTTPS fecha essa porta no primeiro pedido, e o HSTS fecha-a em todos os seguintes.
Como corrigir consoante o teu alojamento
- Vercel, Netlify, Cloudflare Pages, Railway, Render: o redirecionamento vem ativado. Se vês o achado, normalmente o domínio aponta para outro servidor ou há um proxy à frente a responder por HTTP.
- Cloudflare como proxy: ativa "Always Use HTTPS" e põe o modo SSL em "Full (strict)". Com "Flexible", o troço entre a Cloudflare e o teu servidor vai sem cifragem.
- nginx:
server {
listen 80;
server_name oteudominio.com www.oteudominio.com;
return 301 https://$host$request_uri;
}
- Apache: no VirtualHost da porta 80,
Redirect permanent / https://oteudominio.com/. - Express atrás de um proxy: um middleware que verifique
req.headers['x-forwarded-proto'] !== 'https'e responda comres.redirect(301, 'https://' + req.headers.host + req.url), comapp.set('trust proxy', 1).
Usa um 301 ou um 308 (permanentes) e não um 302: os motores de busca consolidam a autoridade na versão HTTPS e os navegadores guardam o salto em cache. Depois acrescenta o cabeçalho HSTS, que mede o check de HSTS fraco, para que o navegador nem sequer tente HTTP da próxima vez.
Confirma que está corrigido
curl -sI http://oteudominio.com | grep -iE "^HTTP|^location"
curl -sI http://oteudominio.com/uma-pagina-qualquer | grep -iE "^HTTP|^location"
curl -sI http://www.oteudominio.com | grep -iE "^HTTP|^location"
As três devem responder 301 ou 308 com um Location que comece por https://. Se a segunda não redireciona, a tua regra só cobre a página inicial.
Perguntas frequentes
Não basta ter HTTPS ativado?
Não. Ter certificado significa que a versão segura existe; o redirecionamento significa que a insegura não é usada. Sem ele, as duas coexistem.
Porquê 301 e não 302?
O 302 é temporário: os navegadores voltam a pedir a versão HTTP de cada vez e os motores de busca não transferem a autoridade. O 301 (ou o 308, que além disso conserva o método) é o sinal de que a mudança é definitiva.
A minha API não precisa de HTTPS, só a minha app a usa.
Precisa, sim: por essa API viajam tokens e dados dos teus utilizadores. E se a app a chama por HTTP a partir de uma página HTTPS, o navegador bloqueia-a como conteúdo misto.