Смешанный контент — ситуация, когда сама страница открыта по защищённому протоколу, а ресурсы внутри неё запрашиваются по обычному:
<!-- страница: https://example.ru/ -->
<img src="http://example.ru/img/logo.png">
<script src="http://cdn.example.com/script.js"></script>
Соединение считается защищённым лишь настолько, насколько защищена его слабейшая часть. Скрипт, полученный по HTTP, можно подменить по дороге — и он получит полный доступ к странице.
Как ведёт себя браузер
Активный контент — скрипты, стили, iframe, шрифты, запросы к API — блокируется полностью. Без предупреждений для посетителя: просто не работает меню, не отправляется форма, разъезжается вёрстка. В консоли при этом будет Mixed Content: The page at ... was loaded over HTTPS, but requested an insecure resource.
Пассивный контент — изображения, аудио, видео — обычно загружается, но замочек в адресной строке меняется на предупреждение «Соединение не полностью защищено».
Самое неприятное здесь — что владелец сайта проблему часто не видит: у него страница закэширована, а у нового посетителя половина функций мертва.
Откуда берётся
- Переезд на HTTPS без замены адресов в базе и шаблонах — главная причина.
- Абсолютные адреса в контенте: редактор вставил картинку с полным
http://-адресом. - Сторонние сервисы — старые виджеты, счётчики, карты, чаты, подключённые по HTTP.
- Жёстко прописанные адреса в коде темы или плагина.
Как найти
- Пункт аудита «Смешанный контент» показывает найденные http-ресурсы списком.
- В браузере:
F12→ Console. Все заблокированные и небезопасные запросы там перечислены с адресами. - В базе данных (для CMS) поиск по
http://ваш-домен.
Как исправить
1. Замените адреса в базе. Для WordPress подойдёт инструмент Better Search Replace или WP-CLI:
wp search-replace 'http://example.ru' 'https://example.ru' --skip-columns=guid
Обязательно сделайте резервную копию до замены.
2. Поправьте шаблоны и код. Ищите http:// в файлах темы, в подключениях скриптов и стилей.
3. Используйте относительные адреса для своих ресурсов — тогда протокол берётся от страницы:
<img src="/img/logo.png">
4. Сторонние сервисы — на HTTPS. Почти все давно поддерживают его; достаточно поменять протокол в коде вставки. Сервис, который до сих пор работает только по HTTP, стоит заменить: это признак заброшенности.
5. Страховочная директива — на время, пока чините вручную:
Content-Security-Policy: upgrade-insecure-requests
Браузер сам подставит https:// вместо http:// в запросах. Это костыль, а не решение: если ресурс по HTTPS недоступен, он просто не загрузится. Но он спасает старый контент, который правится долго (про CSP).
После исправления
Проверьте не только главную: смешанный контент обычно живёт в старых статьях и карточках товаров, куда картинки вставляли вручную.