Несмотря на то, что в интернете множество информации о переводе сайта на https, я решил создать ещё один материал на эту тему, а точнее осветить решение проблем, которые могут возникнуть при подключении сертификата. И соединить в одну статью всю информацию, которую автор по крупицам собирал, переводя другие сайт на SSL. 

Многие вебмастеры уже успешно перевели вебсайт в защищенный режим. Однако не всем удалось избежать проблем, некоторым из них приходилось обращаться за услугами специалистов, а некоторые проблемы всплывают лишь со временем. Попытаемся же решить их раз и навсегда.

Беспроблемный перевод сайта с http на https
Беспроблемный перевод сайта с http на https

Многие инструкции в вводном тексте рассказывают  небольшую теорию о протоколах, для тех кому это интересно, я лишь укажу ссылки на отдельные статьи: Плюсы и минусы перехода на HTTPS. Там же можно найти и информацию о требованиях гугла. Кроме этого многим пришли письма с темой "В Chrome 56 будет появляться предупреждение о проблемах с безопасностью на сайте". Думаю этого хватит к размышлению, перейдём к практике.

Как проверить установку сертификата ssl на сайт?

Сейчас есть множество сертификатов от разных компаний, различия в основном в цене. Есть и бесплатные, самый популярный вариант Let's Encrypt. Так как популярные хостинги включили в пакет услуг установку бесплатного сертификата, то мы не будем останавливаться на вопросе инсталляции сертификата на хостинг из-за большого различия вариантов. Надеюсь позже я рассмотрю проблему с ручной установкой сертификата Let's Encrypt, по которой степень защищенности классифицируется лишь "B" (тест от SSL Labs).

Для владельцев покупных сертификатов Comodo распространенной ошибкой является не совсем корректная установка, а точнее пропуск промежуточного сертификата. Исправляется достаточно просто - достаточно досконально изучить инструкцию установки.

Итак, будем считать, что сертификат уже успешно установлен и настроен на сервере, поэтому нам остается только настроить корректную работу HTTPS на сайте. Для начала стоит убедиться, нету ли ошибки сертификата: вводим в браузере url сайта с https и (для браузера Chrome) смотрим инструменты разработчиков (Ctrl+Shift+I), вкладку Безопасность (Security):

Как проверить валидность сертификата на сайте
Как проверить валидность сертификата на сайте

И если мы видим зеленые квадратики напротив Valid Certificate и Secure Connection - то значит сертификат стал корректно на сайт и не является самоподписанным. В противном случае стоит разобраться с установкой сертификата, где-то была допущена ошибка. Третий пункт Secure Resources говорит о защищенности ресурсов, которые подключаются при загрузке страницы - надо быть готовым, что любые скрипты, стили или изображения даже с внешних сайтов должны передаваться только по https. Если на внешних сайтах нету версии с защищенным протоколом, то придется отказаться от использования таких ресурсов. Иначе это грозит постоянной ошибкой смешанного содержимого (Mixed Content). Как это исправить я опишу ниже.

Для решения проблемы со смешанным содержимым необходимо, чтобы все ресурсы сайта отдавались по https. В большинстве популярных CMS существует опция переключения между http и https. Однако рассмотрим более детально для наиболее распространенных.

Включение HTTPS на сайте Joomla

В первую очередь необходимо включить SSL на весь сайт. Сделать это можно через админку, для этого необходимо пройти по ссылке /administrator/index.php?option=com_config или выбрать в меню Система -> Общие настройки. После этого открываем вкладку "Сервер" и выставляем "Включить SSL" на значение "Весь сайт".

Включить HTTPS в админке джумлы
Включить HTTPS в админке джумлы

Также можно включить и отключить (например при некорректной работе сайта) этот параметр в конфигурационном файле configuration.php

Находим строчку

public $force_ssl = '2';

и выставляем значение '2' для всего сайта, '1' - только для панели управления и '0' если хотим отключить полностью (если кольцуется редирект к примеру)

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

public $live_site = '';

она должна быть или пустой или содержать адрес сайта с https. Лучше всего оставлять данную строчку пустой.

Кроме этого есть вероятность получить следующего рода ошибку при включении пункта forse ssl в админке: HTTPS не был включен, он не доступен на этом сервере. И после этого в настройках не сохраняется указанное значение. Для того, чтобы выявить причину проблемы, необходимо узнать ответ сервера, которые приходит при проверке на доступность HTTPS. Находим файл administrator/components/com_config/model/application.php и вместо строки

$app->enqueueMessage(JText::_('COM_CONFIG_ERROR_SSL_NOT_AVAILABLE'));

пишем:

$app->enqueueMessage(JText::_('COM_CONFIG_ERROR_SSL_NOT_AVAILABLE') . ' - Response code was: ' . $response->code);

На данный момент это 156 строка. Если код отличен от 200 - значит стоит искать причину по коду ошибки. Но может приходить и пустой ответ. Если внимательно присмотреться в логи, то можно будет выявить, что скорее всего у нас отключен модуль curl на сервере или же некорректно настроен.

После этого стоит проверить все страницы на смешанное содержимое и подправить файлы шаблонов, плагинов, модулей и компонентов, если они указывают ссылки с http (к примеру известной ошибкой является подключение гугл шрифтов по http, хотя они уже давно доступны по https).

Однако ссылки с http могут быть не только в коде, а также содержаться в материалах на сайте. В этом случае необходимо лезть в базу данных и массово заменять посторонние подключения скриптов, изображений и стилей на https, а если были указаны абсолютные пути - более правильно будет заменить их на относительные.

После всех этих манипуляций зеленый замок должен гореть на всех страницах.

Перевод сайта на ssl на вордпрессе

Ситуация с Wordpress аналогична с Joomla, но здесь есть несколько специфичных нюансов.

Итак, для начала заходим в Настройки -> Общие в админке вордпресс (также это можно сделать по ссылке /wp-admin/options-general.php) и прописываем "Адрес WordPress (URL)" и "Адрес сайта (URL)" новые ссылки с https.

Как включить SSL в вордпрессе?
Как включить SSL в вордпрессе?

 Не забываем сохранить! Совет: переключить Wordpress на SSL можно и через конфигурационный файл wp-config.php с помощью строчек:

define('WP_SITEURL', 'https://');
define('WP_HOME',    'https://');

Не забудьте только подставить ссылку на свой сайт!

Аналогично заменяем в коде незащищенные ссылки на правильный вариант. С базой данных стоит быть осторожными, если у вас платные темы с навороченными настройками, то они хранятся в json формате в таблицах бд, строки которых имеют определенную длину. При замене через базу данных Вы можете получить настройки шаблона по умолчанию - поэтому лучше сделайте это через админку.

После этих пару нехитрых действий сайт должен гореть зеленым светом для браузера.

Как настроить и включить SSL в OpenCart

В отличие от других популярных CMS, у опенкарта есть свои проблемы с переходом на защищенный протокол. В сети есть различные модули, но они не гарантируют корректной работы, поэтому будем обходиться своими средствами для перевода сайта на https. Инструкция будет базироваться на Opencart 2.x, однако данные действия прекрасно подходят для других версий и сборок.

Итак, для начала заходим в административную панель OcStore, чтобы переключиться на SSL фронтэнд и бэкэнд. Для этого необходимо в настройки (Магазины -> Настройки), выбрать нужный магазин (если конечно он не один) и нажать кнопку редактировать. Далее мы переходим во вкладку "Сервер" и ищем категорию "Защита". Переставляем галочку в пункте настроек "Использовать SSL" на "Да" и не забываем нажать кнопку "Сохранить". В итоге у нас должно получиться как на скриншоте:

Включить HTTPS в админке опенкарт
Включить HTTPS в админке опенкарт

На этом настройка админки завершена, переходим к правке файлов!

Заходим в файловый менеджер и открываем конфигурационные файлы config.php и admin/config.php. Проверяем, чтобы переменным для HTTPS был верно задан протокол, и если это не так, то исправляем. Для примера приведу строки из папки admin:

// HTTPS
define('HTTPS_SERVER', 'https://protectyoursite.ru/admin/');
define('HTTPS_CATALOG', 'https://protectyoursite.ru/');

Также я советовал бы добавить и http переменным букву s в протокол (добавляем только в протокол в ссылке сайта, HTTP_SERVER и HTTP_CATALOG не изменяем). В итоге это будет выглядеть так:

// HTTP
define('HTTP_SERVER', 'https://protectyoursite.ru/admin/');
define('HTTP_CATALOG', 'https://protectyoursite.ru/');

Делать это рекомендую по той причине, что не все темы или модули корректно прописывают выбор протокола, в частных случаях бывает зашита просто переменная HTTP_SERVER - и потом сложно понять, почему сайт не полностью подхватывает https.

В интернете встречаются мануалы, где указывают константу HTTPS_IMAGE - если в вашем конфиге данной строки не было, то не трогайте и не добавляйте лишних значений, иначе это может привести к дополнительным ошибкам!

Обязательно стоит почистить кеш (папки /vqmod/vqcache и /system/cache) и можно проверять страницы интернет-магазина на наличие смешанного содержимого, и если есть, то пройтись поиском по базе данных и по файлам на сервере.

И последний пункт не обязательный, но может помочь в редких ситуациях.

Открываем каталог на сервере /system/config и редактируем следующие файлы: admin.php и catalog.php. Если в HTTP_SERVER указали сайт с https:// протоколом, то тогда код должен выглядеть следующим образом ( если строчки отсутствуют, их необходимо добавить):

$_['site_base'] = substr(HTTP_SERVER, 7);
$_['site_ssl'] = true;

Данные строчки могут помочь с определением абсолютных путей, неверным прописыванием canonical либо тега base href. Если у вас всё в порядке, то выполнять его не надо!

Обязательно добавьте перенаправление (описано ниже, как правильно осуществлять и когда) со старого протокола на ssl для успешной склейки зеркал и после всех действий о проблемах перевода сайта на защищенный протокол можно позабыть. 

Настраиваем 301 редирект с http на https

Существует несколько мнений про необходимость 301 редиректа: к примеру лучше сначала проиндексировать новые страницы, а потом уже настроить редирект дабы не было дублей, другие считают, что стоит сразу прописывать 301 и вес старых страниц перейдет на https версию. На самом деле алгоритмы поменялись и сейчас существует только один правильный вариант: сначала необходимо склеить зеркала в яндексе через переезд сайта (описано ниже), а потом уже настраивать редирект для склейки гуглом. В противном случае (если делать редирект сразу) переезд сайта может закончиться ошибкой и привести к непредсказуемым результатам.

Перед тем как добавлять различные конструкции редиректов в настройки сервера или файл .htaccess убедитесь, что он необходим: многие хостинги автоматически настраивают перенаправление на системном уровне, а лишние редиректы могут только привести к ошибкам. Кроме этого в настройках хостинга или панелей ( типо ISPManager) есть настройка редиректов и хватает тоже поставить просто галочку. Для примера приведу скрин из настроек панели ISP в www-домены:

Как в ISPManager включить перенаправление на https
Как в ISPManager включить перенаправление на https

Если же http версия сайта отдаёт код 200, то необходимо настроить корректный редирект. Тут зависят возможности от тарифного плана на хостинге, на выделенном сервере лучше настраивать через nginx или apache, на шаред хостинге придется довольствоваться файлом .htaccess

Настройка редиректа с http на https в nginx

Находим конфигурационный файл нашего сайта, обычно он располагается по пути /etc/nginx/vhosts/ и имеет расширение .conf

Вариаций настроек много, приведу лишь пример:

server {

...

listen ip:80;

return 301 https://$host$request_uri;

}

server {

...

location @fallback {

 

/

...

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

ssl_session_timeout 5m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;

ssl_prefer_server_ciphers on;

add_header Strict-Transport-Security "max-age=31536000;";

listen ip:443;

ssl on;

Это лишь часть настроек сервера, не надо полностью заменять содержимое своего файла, копируйте лишь необходимые строки. И не забудьте указать свой айпи сервера вместо ip.

Но тут есть один нюанс. Чтобы не было циклического редиректа (а эта частая проблема ISP) необходимо в настройках apache (обычно файл расположен в /etc/apache2/vhosts или /etc/apache2/sites-available с названием домена.conf) добавить строку в директиву VirtualHost:

SetEnvIf X-Forwarded-Proto https HTTPS=on

После сохранения файлов не забудьте перезапустить апач и nginx для применения конфигураций (к примеру можно сделать следующими командами SSH:

service nginx reload
service apache2 reload

Редирект с http на https в .htaccess

Я приведу несколько вариантов файлов, потому что под разные хостинги обычно лучше сработает тот или иной вариант. Самый простой вариант перенаправления сайта на ssl через .htaccess:

RewriteEngine On

RewriteCond %{HTTPS} OFF

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Идентичным вариантом будет:

RewriteCond %{SERVER_PORT} !^443$

RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Можно использовать и другой вариант, он сразу в себя включает и редирект с www на без www, поэтому если было такое перенаправление, его лучше убрать:

RewriteCond %{HTTP_HOST} ^(www\.)?sitename\.com$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^(.*)$ https://sitename.com/$1 [R=301,L]

Если вариант выше выдает ошибку "Сайт совершил перенаправление много раз", то стоит попробовать использовать следующий тип редиректов:

RewriteCond %{HTTP_HOST} ^www\.?protectyoursite\.ru$ [NC]

RewriteCond %{HTTP:X-Forwarded-Proto} !=https

RewriteRule ^(.*)$ https://protectyoursite.ru/$1 [R=301,L]

Не забывайте только подставлять свой домен! Будьте всегда осторожны с нагромождениями редиректов, всегда лучше обходиться минимальнальным набором, чтобы не было зацикливания. Эти варианты универсальны и подходят под стандартные CMS, вставлять их можно как в начале файла, так и в конец файла после всех редиректов.

Что необходимо сделать в плане СЕО при переезде на HTTPS?

Как я писал, многие переживают за потерю траффика при подключении SSL сертификата, и вполне небезосновательно: поисковики не гарантируют, что позиции останутся прежними и что сайт не вылетит с поиска. Дабы минимализировать потери и избежать просадки позиций необходимо сделать несложный минимальный набор.

  1. Добавить версию сайта с HTTPS в панель вебмастера Яндекс ( при этом старый сайт удалять не надо, они потом склеятся)
  2. В яндекс вебмастере в версии сайта с http перейти во вкладку Индексирование -> Переезд сайта и поставить галочку на пункте "Добавить HTTPS" и нажать сохранить.
    Переезд сайта на HTTPS в Яндекс Вебмастер
    Переезд сайта на HTTPS в Яндекс Вебмастер

    После это в течение нескольких дней произойдет склейка зеркал, а также обнулится Тиц - не стоит переживать, со следующим апом он вернется! 

  3. Добавить версии с https:// и https://www. в панель Google Webmaster
  4. Изменить в файле robots.txt директивы Host: и Sitemap: на https версии сайта. Также убедиться, чтобы карта сайта отдавала ссылки с новым протоколом.
  5. После успешной склейки зеркал в Яндекс Вебмастере (важно! только после полной склейки) надо делать 301 редирект с http на https

После всех взаимодействий с переходом для оценки результатов переноса сайта на https желательно выждать около месяца - тогда уже окончательно должно все склеиться и траффик будет идти только по защищенной версии. И тогда можно будет анализировать или потери, или вполне возможно небольшой прирост в позициях.

Решение проблем при переезде на https

Одним из популярных вопросов является факт, что при установке редиректа поисковые системы не видят по http версии файла robots.txt (потому что тот отдает 301 ответ сервера, а не 200)

С одной стороны это больше зависит от настроек сервера, в большинстве случаев статический контент должен отдавать по обеим версиям: http и https.

Но даже если этого не происходит, то не стоит волноваться напрасно, нам теперь вовсе необязательно, чтобы доступна была старая версия сайта, вся информация должна находиться и быть доступна по https.

Можно также добавить как исключение в наш редирект в файле .htaccess дополнительное правило:

RewriteCond %{REQUEST_URI} !robots.txt

После этого наша конструкция должна приобрести вид типо:

RewriteCond %{HTTP_HOST} ^(www\.)?sitename\.com$ [NC]

RewriteCond %{HTTP:X-Forwarded-Proto} !=https

RewriteCond %{REQUEST_URI} !robots.txt

RewriteRule ^(.*)$ https://sitename.com/$1 [R=301,L] 

После этого проверить ответ сервера.

Надеюсь у всех переход на защищенный протокол произойдет гладко и без происшествий. Оставляйте свои советы или вопросы в комментариях. А если Вы сами не можете справиться с переездом, то можете заказать качественную услугу перевода сайта на https за небольшую сумму в любой контактной форме.

Добавить комментарий