Come risolvere l’errore “Mixed Content” su WordPress HTTPS
Hai attivato il certificato SSL sul tuo sito WordPress ma il browser mostra un avviso di contenuto misto (mixed content)? Il lucchetto nella barra degli indirizzi è grigio o mostra un triangolo di avvertimento? Questo problema si verifica quando una pagina HTTPS carica risorse (immagini, script, fogli di stile) ancora tramite HTTP. In questa guida ti spiego come identificare e risolvere l’errore mixed content su WordPress in modo definitivo.
Cos’è il mixed content e perché è un problema
Quando il tuo sito usa HTTPS, il browser si aspetta che tutte le risorse della pagina vengano caricate tramite connessione sicura. Il mixed content si verifica quando alcune risorse — immagini, file JavaScript, CSS, font — vengono ancora richieste con il protocollo HTTP non crittografato. I browser moderni bloccano o segnalano queste risorse per proteggere i visitatori.
Ci sono due tipi di mixed content:
- Mixed content passivo: riguarda risorse come immagini, video e audio caricate via HTTP. I browser le caricano ma mostrano un avviso.
- Mixed content attivo: riguarda script JavaScript, CSS e iframe caricati via HTTP. I browser li bloccano completamente perché possono modificare il comportamento della pagina.
Oltre al problema di sicurezza, il mixed content ha un impatto negativo sulla SEO. Google penalizza i siti che non offrono una connessione completamente sicura, e il lucchetto mancante riduce la fiducia dei visitatori.
Come identificare le risorse mixed content
Il primo passo è trovare esattamente quali risorse causano il problema. Ci sono diversi strumenti:
Console del browser
Apri il sito in Chrome, clicca con il tasto destro e seleziona “Ispeziona”, poi vai alla tab “Console”. Vedrai messaggi di errore in giallo o rosso che indicano le risorse caricate via HTTP:
Mixed Content: The page at 'https://tuosito.it/pagina/' was loaded over HTTPS, but requested an insecure image 'http://tuosito.it/wp-content/uploads/2024/01/foto.jpg'.
Ogni messaggio indica il tipo di risorsa e l’URL completo. Annota tutti gli URL che iniziano con http:// invece di https://.
Strumenti online
Puoi usare strumenti come Why No Padlock o SSL Labs che analizzano automaticamente tutte le pagine del sito e generano un report con le risorse non sicure. Sono utili per siti con molte pagine dove controllare la console manualmente sarebbe troppo lungo.
Causa principale: URL hardcoded con http://
Nella maggior parte dei casi, il mixed content su WordPress è causato da URL assoluti con http:// salvati nel database. Quando hai installato WordPress o caricato le immagini, il sito usava HTTP. Dopo aver attivato SSL, gli URL nel database non si aggiornano automaticamente. Gli articoli, le pagine, i widget e le impostazioni del tema contengono ancora riferimenti come http://tuosito.it/wp-content/uploads/…
Soluzione 1: Search and Replace nel database
La soluzione più efficace è sostituire tutti gli URL http:// con https:// nel database. Puoi farlo con WP-CLI:
wp search-replace 'http://tuosito.it' 'https://tuosito.it' --path=/var/www/html/
Se non hai accesso SSH, puoi usare il plugin Better Search Replace. Installalo dalla dashboard, vai su Strumenti > Better Search Replace, inserisci il vecchio URL con http e il nuovo con https, seleziona tutte le tabelle ed esegui la sostituzione. Usa prima l’opzione “Esecuzione di prova” per verificare quante sostituzioni verranno fatte senza modificare nulla.
Importante: fai sempre un backup del database prima di eseguire un search-replace. Un errore nell’URL di sostituzione potrebbe rendere il sito inaccessibile.
Soluzione 2: forzare HTTPS in wp-config.php
Aggiungi queste righe in wp-config.php per assicurarti che WordPress usi sempre HTTPS:
define('FORCE_SSL_ADMIN', true);
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
La prima riga forza HTTPS per il pannello admin. Il blocco successivo è necessario se il sito è dietro un load balancer o un proxy inverso (come Cloudflare) che gestisce SSL al posto del server.
Soluzione 3: aggiungere un redirect .htaccess
Per assicurarti che tutte le richieste HTTP vengano reindirizzate a HTTPS, aggiungi queste regole all’inizio del file .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Questo redirect 301 permanente dice ai browser e ai motori di ricerca che la versione corretta del sito è HTTPS. Tutte le richieste HTTP verranno automaticamente reindirizzate.
Soluzione 4: risorse esterne e CDN
Se il mixed content è causato da risorse esterne (font Google, script di terze parti, immagini da altri siti), devi aggiornare i riferimenti manualmente. Controlla:
- Widget personalizzati: verifica gli URL nei widget della sidebar e del footer.
- Impostazioni del tema: logo, favicon e immagini di sfondo configurate nel Customizer.
- Plugin: alcuni plugin salvano URL assoluti nelle proprie impostazioni.
- CDN: se usi un CDN, assicurati che sia configurato per servire le risorse via HTTPS.
Per le risorse esterne, la soluzione più semplice è cambiare http:// in https:// o usare URL relativi al protocollo (//esempio.com/risorsa.js).
Aggiungere l’header HSTS per la massima sicurezza
Dopo aver risolto il mixed content, puoi aggiungere l’header HTTP Strict Transport Security (HSTS) per istruire i browser a connettersi sempre via HTTPS. Aggiungi questa riga in .htaccess:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Questo header dice al browser: “per i prossimi 12 mesi, connettiti a questo dominio solo via HTTPS, senza nemmeno tentare HTTP”. È un livello di protezione aggiuntivo che previene anche attacchi di tipo downgrade. Attivalo solo dopo aver confermato che HTTPS funziona perfettamente su tutto il sito, perché revocarlo non è immediato.
Prevenire il mixed content in futuro
Dopo aver risolto il problema, assicurati che non si ripresenti. Verifica che le impostazioni di WordPress (Impostazioni > Generali) mostrino l’URL del sito con https://. Quando carichi nuove immagini o inserisci link, WordPress userà automaticamente HTTPS. Se usi un plugin di sicurezza come Really Simple SSL, può forzare automaticamente HTTPS su tutte le risorse del sito come soluzione rapida. Tuttavia, il search-replace nel database resta la soluzione preferibile perché risolve il problema alla radice anziché applicare un filtro a ogni caricamento di pagina.
Content Security Policy come rete di sicurezza
Un’altra tecnica avanzata è usare l’header Content-Security-Policy con la direttiva upgrade-insecure-requests. Questo header dice al browser di convertire automaticamente tutte le richieste HTTP in HTTPS prima di inviarle:
Header always set Content-Security-Policy "upgrade-insecure-requests"
È una soluzione elegante che funziona come rete di sicurezza: anche se nel database restano alcuni URL con http, il browser li converte automaticamente. Combinata con il search-replace nel database, garantisce una copertura completa contro il mixed content.
Il mixed content persiste?
Se dopo aver provato tutte le soluzioni il problema persiste, potrebbe esserci un conflitto con il tema o un plugin che genera URL in modo dinamico. Il team di SoccorsoWP può analizzare il tuo sito, identificare tutte le fonti di mixed content e risolverle definitivamente. Apri un ticket e ottieni il lucchetto verde.