Come appare il messaggio
Mixed Content: The page at 'https://example.com/' was loaded over HTTPS, but requested an insecure script 'http://example.com/js/app.js'. This request has been blocked; the content must be served over HTTPS.Cause frequenti
- URL
http://scritti a mano in template, CSS, JavaScript o nei contenuti salvati nel database. - Il sito è passato a HTTPS ma il CMS ha ancora
http://insiteurl,homeo nei vecchi articoli. - Dietro un reverse proxy l'applicazione non sa che la richiesta era HTTPS e genera link
http://(mancaX-Forwarded-Proto). - Uno script, un font o un widget di terze parti viene caricato in HTTP.
- Un redirect interno all'applicazione manda una richiesta API o di asset a un indirizzo
http://.
Verifica
- Elenca le risorse http:// nell'HTML consegnato
curl -s https://example.com/ | grep -oE '(src|href|action)="http://[^"]+"' | sort -u | head -n 20 - È già impostata una policy che aggiorna le richieste?
curl -sI https://example.com/ | grep -i 'content-security-policy' - Il proxy passa lo schema all'app?
nginx -T 2>/dev/null | grep -n 'X-Forwarded-Proto' - Gli URL esatti bloccati in un file CSS
curl -s https://example.com/assets/app.css | grep -oE 'url\(http://[^)]+\)' | sort -u
Soluzione
- Sostituisci
http://conhttps://(o con un URL relativo come/js/app.js) in template, CSS e JavaScript. - Aggiorna il CMS: imposta l'indirizzo del sito su
https://ed esegui la sua funzione di cerca e sostituisci per i vecchi contenuti nel database, prima con un backup. - Dietro un proxy passa lo schema:
proxy_set_header X-Forwarded-Proto $scheme;e configura l'applicazione perché si fidi. - Come soluzione temporanea invia
Content-Security-Policy: upgrade-insecure-requestscosì il browser porta a HTTPS le richieste che il server supporta. - Sostituisci le risorse di terze parti che non hanno una versione HTTPS.
Domande frequenti
Perché alcune risorse miste danno solo un avviso e altre sono bloccate?
I browser bloccano script, stili e richieste (contenuti attivi) e trattano con più indulgenza immagini, audio e video (contenuti passivi), o li aggiornano. Non fare affidamento su nessuno dei due: correggili tutti.
upgrade-insecure-requests è una soluzione vera?
Funziona solo se la destinazione esiste anche in HTTPS. È una buona rete di sicurezza, ma gli URL vanno comunque corretti alla fonte.