HTTPS включили, а сайт всё равно ругается: mixed content и редиректы
После подключения HTTPS сайт не всегда сразу становится “зелёным”. Браузер может показывать предупреждение, часть стилей не загружается, картинки пропадают, формы работают странно. Частая причина — mixed content: страница открыта по HTTPS, но внутри неё есть ресурсы по HTTP.
Иногда проблема не в сертификате, а в старых абсолютных ссылках, настройках редиректа, canonical, sitemap или внешних скриптах.
Проверить сертификат и редирект
Сначала нужно убедиться, что HTTPS открывается и отдаёт корректный код. Затем проверить редирект с HTTP на HTTPS.
curl -I https://example.ru/
curl -I http://example.ru/
Обычно HTTP должен отдавать 301 на HTTPS. Если открываются обе версии без редиректа, поисковые системы и пользователи могут видеть дубли.
server {
listen 80;
server_name example.ru www.example.ru;
return 301 https://example.ru$request_uri;
}
Mixed content
Mixed content хорошо видно в консоли браузера. Нужно открыть DevTools, вкладку Console или Security, и посмотреть, какие ресурсы грузятся через http://.
Типовые источники:
- картинки в контенте;
- CSS и JS в старом шаблоне;
- шрифты;
- внешние виджеты;
- абсолютные ссылки в базе;
- Open Graph изображения.
По проекту можно быстро поискать старые абсолютные ссылки:
grep -R "http://example.ru" -n views config web
grep -R "http://" -n views config web
Если ссылки хранятся в базе, нужно искать и там. Например, в контентных страницах:
SELECT id, title
FROM pages
WHERE content LIKE '%http://example.ru%';
Не всегда нужно писать абсолютный URL
Для внутренних ресурсов в шаблонах часто достаточно относительных путей. Так сайт будет нормально работать и на HTTPS, и на тестовом домене.
<link rel="stylesheet" href="/css/site.css">
<script src="/js/app.js"></script>
Для внешних ресурсов лучше использовать https://, если сервис его поддерживает. Старый вариант с protocol-relative URL сейчас обычно не нужен.
Настройки Yii2
Если Yii2 генерирует абсолютные ссылки, нужно проверить hostInfo и baseUrl. После переезда на HTTPS там иногда остаётся http.
'urlManager' => [
'hostInfo' => 'https://example.ru',
'enablePrettyUrl' => true,
'showScriptName' => false,
],
Если проект находится за прокси или балансировщиком, Yii2 может не понимать, что исходный запрос был HTTPS. Тогда отдельно проверяют trusted hosts и заголовки прокси.
Canonical, sitemap и robots.txt
После подключения HTTPS нужно обновить не только редирект. В canonical и sitemap должны быть HTTPS-адреса.
curl -s https://example.ru/ | grep -i canonical
curl https://example.ru/sitemap.xml | grep "http://"
curl https://example.ru/robots.txt
Если sitemap продолжает отдавать http-ссылки, поисковики будут видеть старые адреса. Даже при редиректе это лишняя техническая путаница.
Формы и внешние обработчики
Форма может быть на HTTPS-странице, но отправляться на HTTP-action. Браузер может заблокировать такой запрос или показать предупреждение.
<form action="https://example.ru/contact/send" method="post">
Лучше использовать относительный action, если обработчик находится на том же сайте:
<form action="/contact/send" method="post">
Cookies
После перехода на HTTPS стоит проверить cookies. Для авторизации и сессий обычно полезен secure-флаг, чтобы cookie не уходила по HTTP.
'request' => [
'cookieValidationKey' => 'secret',
'csrfCookie' => [
'httpOnly' => true,
'secure' => true,
],
],
'session' => [
'cookieParams' => [
'httpOnly' => true,
'secure' => true,
],
],
Перед включением secure нужно убедиться, что сайт действительно работает только через HTTPS. Иначе пользователи на HTTP могут потерять сессию.
Чек-лист после подключения HTTPS
- HTTPS открывается с корректным сертификатом.
- HTTP отдаёт 301 на HTTPS.
- Нет mixed content в консоли браузера.
- В шаблонах нет старых http-ссылок.
- В базе нет абсолютных ссылок на старый http-домен.
- Canonical использует HTTPS.
- sitemap.xml содержит HTTPS-адреса.
- Формы отправляются на HTTPS или относительный URL.
- Cookies настроены с учётом HTTPS.
HTTPS — это не только установка сертификата. После переключения нужно проверить все места, где сайт сам ссылается на себя или загружает ресурсы. Иначе технически сертификат есть, но пользователь всё равно видит предупреждения.