Протокол передачи данных HTTP служит людям верой и правдой с 1991 года. Видимо, в последние годы веры и правды в людях значительно поубавилось — сейчас на каждом углу орут о том, какой это небезопасный протокол, что вся переданная по нему информация может быть доступна третьим лицам.

Знакомый недавно поделился пруфом. Его домашний wi-fi ломанули и сосниффили административный доступ к довольно крупному форуму.

Если вы пользуетесь публичным wi-fi (например, в кафе), то ни в коем случае не следует вводить пароль или данные карты на сайте, в адресной строке которого отсутствует такой зелёный замочек.

Больше всего, конечно, ситуация кошмарит вебмастеров: именитые центры сертификации просят за ssl-сертификат для сайта от нескольких тысяч до сотен тысяч рублей. Установка сертификата на сайт чревата перебоями и потерей трафика. В этой статье поделюсь своим опытом переноса сайта на HTTPS бесплатно и без проблем.

Кстати, вот так выглядит незащищённое соединение на моём сайте:

Мало кто захочет видеть на своём коммерческом сайте такую картину. Если сайт — магазин или платный сервис, подобные уведомления браузеров являются прямой угрозой лояльности клиентов. И про оптимизацию как не вспомнить, когда бродят слухи о снижении позиций небезопасных сайтов. А вскоре, возможно, принимающие платёжные данные по открытому протоколу HTTP сайты будут вовсе исключаться из выдачи поисковых систем. В такое смутное время не удивительно, что SEO начинается с надписи «надёжный» рядом с адресом сайта.

Я не спешу переходить на SSL — тренируюсь на сайтах заказчиков. 🙂 Похоже, выбранная мной схема переноса уже довольно хороша. Основная ошибка вебмастеров при переходе на HTTPS заключается в том, что они сразу настраивают редирект на защищённое соединение. Между тем, поисковым системам нужно время для смены основного зеркала сайта. И первое время они «видят» ситуацию так: основное зеркало сайта шлёт трафик на неосновное — что-то тут не так, надо разобраться, а пока стоит уменьшить трафик этому сайту (на всякий случай).

Потому я предлагаю (и реализую) вариант, когда сайты некоторое время благополучно работают на обоих протоколах. Если сайт запрошен по http, то все его внутренние ссылки и загружаемые ресурсы используют протокол http. И в файлах sitemap ссылки по прежнему с http. Но если сайт запрошен по защищённому протоколу https, то все ресурсы, разумеется, загружаются по зашифрованному каналу (иначе возникает ситуация mixed content — что выглядит ещё хуже, чем вовсе не использовать защищённое соединение). И ссылки карты сайта на защищённом протоколе ведут на https, и канонические URL в мета-тегах начинаются с https. Редирект на https оправдан только на страницах ввода паролей, персональных данных и в административной зоне.

Когда мы убедились, что все страницы сайта светят зелёным замком, что защищённая версия сайта ни в каких местах не пытается вернуть посетителя на незащищённое зеркало — самое время намекнуть о переезде сайта поисковым системам. Для этого заходим в инструменты вебмастеров и указываем новое главное зеркало. Например, так переезд выглядит в Яндекс-вебмастере:

Также инструментарию вебмастера Яндекса и Гугла стоит скормить ссылки на https-sitemap. Для Яндекса также в файле robots.txt не забыть поменять директиву HOST, чтобы у него не возник диссонанс. Затем ждём ровно до тех пор, пока инстумены вебмастера Яндекса и Гугла не покажут нам, что основное зеркало изменено, что https-версия сайта проиндексирована и получает большую долю поискового трафика. Вот теперь можно включить редирект с http на https и забыть былые ужасы.

Немного технической части. Сертификаты я заказываю в Let's Encrypt. Можно это делать на сайте sslforfree.com, но мне удобней помощи официальной консольной софтины «certbot-auto». Плюс утилиты в том, что я могу настроить запуск по расписанию certbot-auto renew и забыть о том, что бесплатные сертификаты от Let's Encrypt нужно обновлять каждые 2 месяца (максимальный срок действия — 90 дней).

Чаще всего я работаю с сайтами на WordPress. В каждой первой статье по переносу блога WP на SSL советуют менять адреса сайта (в админке или БД), чтобы избежать ситуации «mixed content». Этого делать не стоит, потому что в этом случае WordPress задействует редирект со старого зеркала на новое, и мы теряем поисковый трафик. Вместо этого стоит вписать в config.php:

if ( $_SERVER['HTTPS'] ) {
	define('WP_HOME','http://example.com');
	define('WP_SITEURL','http://example.com');
	define('WP_PLUGIN_URL', 'https://example.com/wp-content/plugins');
}

Обычно установки этих констант достаточно, чтобы шаблоны темы оформления и плагины поняли, в чём дело. А дело в том, что адреса нового зеркала используются только тогда, когда сайт запрошен по HTTPS.

Возможна ситуация, что защищённое соединение у вас устанавливает сервер Nginx, а не Apache, тогда глобальная переменная $_SERVER['HTTPS'] может быть не установлена. В этом случае надо привлекать хостера, но могу подсказать свой вариант — пользуйтесь им только если точно знаете, что делаете. Я в конфиг ssl.conf сайта в location / { ... } прописываю proxy_set_header SSL 1;. И теперь в php доступна переменная $_SERVER['HTTP_SSL'], если сайт запрошен по защищённому протоколу. Затем дело техники установить:

if ( isset( $_SERVER['HTTP_SSL'] ) ) {
	$_SERVER['HTTPS'] = 1;
	# и устанавливаем константы
}

Надо обязательно устанавливать $_SERVER['HTTPS'] = 1, т.к. WP использует эту переменную в функции is_ssl () и выполняет работу по устранению ошибок «mixed content».

Обязательно для HTTPS версии сайта добавляем фильтр контента и меняем зеркало сайта в адресах ссылок и картинок:

add_filter( 'the_content', function ( $c ) {
	if ( ! is_ssl() ) return;
	$home_http = str_replace( 'https://', 'http://', WP_HOME );
	$c = str_replace( $home_http, WP_HOME, $c );
	return $c;
}, 100 );

Могут быть трудности с некоторыми плагинами. Например, на моём подопытном установлен плагин «Yoast SEO», который генерирует sitemap. На стадии генерации удалось его легко убедить генерировать ссылки с протоколом, соответствующим запросу — установкой фильтра 'wpseo_sitemap_url'. Но он кэширует карту (и это правильно). А при отображении кэшированной карты никакого фильтра не использует (а это неправильно). Пришлось подкорректировать файл 'class-sitemaps.php', чтобы ссылки в сайтмапах имели протокол, соответствующий протоколу запроса. Но это временная мера — только до тех пор, пока Яндекс не обживётся на новом зеркале, тогда можно будет сделать редирект и использовать только защищённое соединение.

Кстати, когда Яндекс успешно переклеит зеркала перенесённых мной сайтов, опубликую графики посещаемости.

Запись опубликована 30 мая 2017 года. Кто-то говорил, что я мало пишу в рубрику «SEO», так читайте же:

Хотите получать новые публикации на почту?

Подписка на RSS канал блога RSS подписка (как это?) поможет вам не пропустить ничего интересного на этом блоге.