Миграция с HTTP на HTTPS: редиректы, mixed content, HSTS
Миграция с HTTP на HTTPS: редиректы, mixed content, HSTS
SSL/TLS проверку перестал быть опциональным ещё в 2018, когда Chrome начал помечать HTTP-сайты как «Not Secure», а Google сделал HTTPS фактором ранжирования. Миграция кажется простой (поставил сертификат → редирект), но 30% проектов теряют трафик из-за mixed content, неправильных canonical или забытых поддоменов. Разбираем пошаговый план миграции без потерь SEO и с максимальной безопасностью.
Шаг 1. Сертификат
Бесплатный вариант — Let's Encrypt через certbot или acme.sh. Платный (EV, wildcard без ограничений) — DigiCert, Sectigo. Команда certbot:
certbot --nginx -d example.com -d www.example.com --redirect --hsts --staple-ocsp
Флаг --redirect сразу настраивает 301 HTTP→HTTPS, --hsts добавляет заголовок, --staple-ocsp — OCSP stapling для скорости.
Шаг 2. 301 редирект HTTP → HTTPS
nginx:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
Apache (.htaccess):
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Используйте именно 301 (permanent) — 302 не передаёт весь «вес» ссылок. Проверка: curl -I http://example.com.
Шаг 3. Mixed content
Mixed content — когда HTTPS-страница подгружает HTTP-ресурсы (скрипты, CSS, картинки). Chrome блокирует активный контент (JS, CSS) и предупреждает о пассивном (img). Найти и починить:
<!-- Плохо -->
<img src="http://cdn.example.com/logo.png">
<script src="http://widgets.example.com/w.js"></script>
<!-- Хорошо -->
<img src="https://cdn.example.com/logo.png">
<!-- или относительно схемы -->
<img src="//cdn.example.com/logo.png">
Автоматический fix — заголовок Content-Security-Policy: upgrade-insecure-requests или block-all-mixed-content.
Шаг 4. HSTS
Через неделю после стабильной работы HTTPS включите HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Не включайте preload пока все поддомены не работают по HTTPS — откат долгий. Подробнее — в HTTP Security Headers.
Шаг 5. Canonical и Open Graph
Обновите canonical-ссылки с http на https во всех <link rel="canonical">, в OG-тегах, в sitemap.xml, в robots.txt и в 301-редиректах внутри CMS.
Шаг 6. Google Search Console
HTTPS-сайт в GSC — это новый property. Зарегистрируйте https://example.com отдельно, добавьте sitemap, сверьте покрытие через 1–2 недели.
Шаг 7. Базы данных и внутренние ссылки
SQL-апдейт ссылок в статьях:
UPDATE posts SET content = REPLACE(content, 'http://example.com', 'https://example.com');
UPDATE postmeta SET meta_value = REPLACE(meta_value, 'http://example.com', 'https://example.com');
В WordPress используйте Better Search Replace, в Drupal — `drush search-replace`.
Проверка
- SSL Labs (ssllabs.com) — грейд A/A+
- Chrome DevTools → Console → «Mixed Content» warnings
- enterno.io SSL Checker — срок, цепочка, протоколы
- Screaming Frog или curl — найти оставшиеся HTTP-ссылки
FAQ
Потеряю ли я SEO-ранжирование? При правильных 301, HSTS и обновлённой sitemap — нет. Google передаёт весь вес через 301. Обычно ранжирование даже растёт за счёт HTTPS-фактора.
Как быть со сторонним скриптом без HTTPS? Либо проксировать через свой nginx с SSL, либо отказаться от этого скрипта. Mixed content блокирует современные браузеры.
Нужен ли HTTPS для блога без форм? Да. ISP инъектируют рекламу в HTTP, отсутствует гарантия подлинности контента, Chrome метит как Not Secure.
Что с поддоменами? Каждый поддомен — отдельный сертификат (или wildcard *.example.com). При HSTS с includeSubDomains — обязательны все.
Вывод
План: certbot → 301 редирект → fix mixed content → HSTS → обновить canonical → зарегистрировать HTTPS в GSC. Добавьте мониторинг SSL-сертификата на автопродление и проверяйте сайт через Security Scanner. Связанное: HTTP Security Headers, Cookie Security.
Проверьте ваш сайт прямо сейчас
Проверить →