Como Resolver o Erro de Mixed Content (SSL)
O mixed content ocorre quando uma página HTTPS carrega recursos (imagens, scripts, CSS) via HTTP. O browser mostra um aviso de segurança, o cadeado desaparece e alguns recursos podem ser bloqueados. É um dos problemas mais comuns após migrar um site para HTTPS e geralmente é simples de resolver.
Porque acontece
Quando activa o SSL, o site passa a carregar em https://. Mas se o conteúdo (artigos, páginas, definições) tem referências a recursos com http:// (URLs absolutos com http), o browser detecta a mistura de conteúdo seguro e inseguro — mixed content.
Causas comuns: URLs de imagens guardados na base de dados com http (carregadas antes do SSL), CSS ou JS de temas/plugins com URLs hardcoded em http, widgets ou embeds com URLs http, e fontes externas ou CDN configurados com http.
Detectar
Browser DevTools: abra o site no Chrome, F12 → Console. Erros de mixed content aparecem como avisos amarelos ou erros vermelhos com o URL do recurso problemático.
Why No Padlock: insira o URL em whynopadlock.com e obtenha uma lista de todos os recursos inseguros na página.
Corrigir
1. Alterar URLs no WordPress: em Definições → Geral, confirme que tanto o “Endereço do WordPress” como o “Endereço do site” usam https://.
2. Search and Replace na base de dados: o plugin Better Search Replace permite substituir http://seudominio.pt por https://seudominio.pt em toda a base de dados com um clique. Marque “Dry Run” primeiro para ver quantas substituições fará, depois execute.
3. Forçar HTTPS via .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
4. Verificar tema e plugins: se o mixed content vem de ficheiros do tema ou plugins (não da base de dados), edite os ficheiros ou contacte o developer. URLs em CSS e JS devem usar // (protocol-relative) ou https://.
Prevenção
Adicione o header CSP (Content Security Policy) para forçar upgrade de pedidos HTTP para HTTPS automaticamente:
Header always set Content-Security-Policy "upgrade-insecure-requests"
Isto instrui o browser a converter automaticamente qualquer pedido http para https, resolvendo mixed content residual.