Смешанное содержимое: HTTP-контент на страницах HTTPS
Коротко: Страница, загруженная по HTTPS, включает ресурсы по незащищённому HTTP; браузеры блокируют это или предупреждают.
Подробнее: Сообщение: Mixed Content: The page at 'https://…' was loaded over HTTPS, but requested an insecure resource 'http://…'. This request has been blocked. Хотя сама страница зашифрована, злоумышленник мог бы прочитать или изменить незашифрованные изображения, скрипты или стили.
Подробности
Виды
- Активное смешанное содержимое (скрипты, таблицы стилей, iframe, fetch/XHR): блокируется браузерами, потому что может скомпрометировать всю страницу.
- Пассивное смешанное содержимое (изображения, аудио, видео): раньше загружалось лишь с предупреждением; современные браузеры автоматически повышают его до HTTPS или блокируют.
- Значок замка исчезает или показывает предупреждение.
Причины
- Жёстко заданные адреса
http://в HTML, CSS, JavaScript или в базе данных (содержимое из времён HTTP). - Сторонние скрипты или встроенные медиа по HTTP.
- URL API, которые в конфигурации всё ещё содержат
http://. - Прокси или CDN, передающие страницу браузеру как HTTP или задающие неверные заголовки
X-Forwarded-Proto, из-за чего само приложение создаёт ссылкиhttp://.
Решения
- В инструментах разработчика (F12 → Консоль) прочитайте затронутые URL.
- Перейдите на HTTPS или используйте относительные адреса (
/image.png). - Замените сохранённое содержимое (CMS, база данных) (
http://domain→https://domain). - Смените сторонние сервисы, если они не поддерживают HTTPS.
- Настройте сервер так, чтобы перенаправление HTTP→HTTPS и HSTS были активны; правильно задайте заголовки прокси.
- Content-Security-Policy
upgrade-insecure-requestsвелит браузеру автоматически повышать ресурсы HTTP до HTTPS (лишь временная мера; лучше исправить источник).
См. также: HTTPS, Заголовки безопасности, Let’s Encrypt, ERR_CERT_DATE_INVALID