So sieht die Meldung aus
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.Häufige Ursachen
- Fest eingetragene
http://-URLs in Templates, CSS, JavaScript oder in den in der Datenbank gespeicherten Inhalten. - Die Seite ist auf HTTPS umgezogen, aber das CMS hat noch
http://insiteurl,homeoder in alten Beiträgen. - Hinter einem Reverse Proxy weiß die Anwendung nicht, dass die Anfrage HTTPS war, und erzeugt
http://-Links (fehlendesX-Forwarded-Proto). - Ein Skript, eine Schrift oder ein Widget eines Drittanbieters wird über HTTP geladen.
- Eine Weiterleitung in der Anwendung schickt eine API- oder Asset-Anfrage an eine
http://-Adresse.
Prüfen
- http://-Ressourcen im ausgelieferten HTML auflisten
curl -s https://example.com/ | grep -oE '(src|href|action)="http://[^"]+"' | sort -u | head -n 20 - Ist schon eine Richtlinie gesetzt, die Anfragen aktualisiert?
curl -sI https://example.com/ | grep -i 'content-security-policy' - Gibt der Proxy das Schema an die App weiter?
nginx -T 2>/dev/null | grep -n 'X-Forwarded-Proto' - Die genauen blockierten URLs in einer CSS-Datei
curl -s https://example.com/assets/app.css | grep -oE 'url\(http://[^)]+\)' | sort -u
Lösung
http://durchhttps://(oder eine relative URL wie/js/app.js) in Templates, CSS und JavaScript ersetzen.- Das CMS anpassen: Die Seitenadresse auf
https://setzen und dessen Suchen-und-Ersetzen für alte Inhalte in der Datenbank laufen lassen, vorher mit Backup. - Hinter einem Proxy das Schema weitergeben:
proxy_set_header X-Forwarded-Proto $scheme;, und die Anwendung so einstellen, dass sie ihm vertraut. - Als Übergangslösung
Content-Security-Policy: upgrade-insecure-requestssenden, damit der Browser Anfragen auf HTTPS hebt, die der Server dort anbietet. - Ressourcen von Drittanbietern ersetzen, die keine HTTPS-Version haben.
Häufige Fragen
Warum werden manche gemischten Ressourcen nur gewarnt und andere blockiert?
Browser blockieren Skripte, Styles und Anfragen (aktive Inhalte) und behandeln Bilder, Audio und Video (passive Inhalte) milder oder heben sie an. Verlass dich auf keins von beidem: Behebe alle.
Ist upgrade-insecure-requests eine echte Lösung?
Es funktioniert nur, wenn das Ziel auch über HTTPS existiert. Es ist ein gutes Sicherheitsnetz, aber die URLs sollten trotzdem an der Quelle korrigiert werden.