HTTPS давно перестал быть опцией для сайтов, где есть формы или платежи — это прямой фактор ранжирования в Google и обязательное условие, без которого браузер показывает посетителю предупреждение «Сайт не защищён» ещё до того, как он увидел первую строчку контента. Перенос действующего сайта на WordPress с HTTP на HTTPS состоит из нескольких последовательных шагов, пропуск любого из которых оставляет часть сайта работать по старому протоколу.
Для подавляющего большинства сайтов достаточно сертификата уровня Domain Validation (DV) — он подтверждает только владение доменом и выпускается автоматически за минуты. Коммерческая проверка организации (OV/EV) имеет смысл для банков и крупных e-commerce проектов, где визуальное подтверждение юрлица в сертификате действительно важно пользователю. Let’s Encrypt выпускает DV-сертификаты бесплатно и автоматически продлевает их — для большинства сайтов на WordPress это закрывает вопрос SSL полностью без дополнительных затрат.
На сервере с Nginx выпуск и установка через стандартный клиент Let’s Encrypt выглядит так:
certbot --nginx -d it-gig.ru -d www.it-gig.ru
Certbot сам находит конфигурацию виртуального хоста, выпускает сертификат и дописывает в конфиг Nginx нужные директивы ssl_certificate/ssl_certificate_key, а также настраивает автоматическое продление через системный таймер — вручную следить за истечением срока действия не требуется.
Наличие сертификата само по себе не заставляет посетителей и поисковик использовать защищённую версию — нужен явный редирект, настроенный на уровне веб-сервера, а не только внутри WordPress:
server { listen 80; server_name it-gig.ru www.it-gig.ru; return 301 https://it-gig.ru$request_uri; }
Редирект именно на уровне Nginx, а не через PHP-плагин, отрабатывает быстрее и не зависит от того, успел ли загрузиться WordPress.
После настройки сервера нужно обновить сам WordPress — в первую очередь опции siteurl и home в базе данных, чтобы они указывали на https://, а не на старый протокол. Дальше — поиск и замена абсолютных ссылок на http:// внутри контента страниц и записей, которые накопились за время работы сайта по HTTP, безопаснее всего через WP-CLI: wp search-replace 'http://it-gig.ru' 'https://it-gig.ru' --skip-columns=guid. Флаг --skip-columns=guid важен — поле GUID не должно меняться после публикации записи по рекомендациям самого WordPress.
Финальный шаг — убедиться, что на сайте не осталось смешанного контента (HTTP-ресурсов на HTTPS-странице), который браузер либо блокирует, либо помечает как небезопасный несмотря на действующий сертификат. SSL Labs Server Test показывает полную картину конфигурации сертификата и протоколов, а встроенный в DevTools браузера консольный вывод предупреждений о Mixed Content — самый быстрый способ найти оставшиеся HTTP-ссылки на конкретной странице.
После того как HTTPS настроен и проверен, следующий уровень — заголовок Strict-Transport-Security, который явно говорит браузеру запоминать, что сайт должен открываться только по HTTPS, и не пытаться соединяться по HTTP даже при прямом вводе адреса без протокола: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; в конфигурации Nginx. Включать includeSubDomains стоит только после того, как все поддомены тоже переведены на HTTPS — иначе недоступный по HTTPS поддомен станет недоступен вовсе.
Перенос только главной страницы на HTTPS с оставлением внутренних страниц на HTTP — технически возможная, но вредная промежуточная конфигурация: поисковик индексирует сайт как частично незащищённый. Вторая ошибка — пропуск обновления изображений и подключаемых скриптов из сторонних CDN, которые продолжают грузиться по HTTP и триггерят предупреждение о смешанном содержимом даже на полностью перенесённом на первый взгляд сайте. Третья — забытый редирект для версии с www, из-за чего оба варианта домена индексируются параллельно как разные сайты, размывая SEO-вес между ними. Четвёртая — сертификат, который выпущен только на корневой домен без поддомена www или наоборот, из-за чего один из двух вариантов адреса сайта продолжает показывать ошибку сертификата при прямом заходе, даже если основной редирект настроен верно.