Решение проблем при переносе сайта WordPress с HTTP на HTTPS

Добрый день, уважаемые друзья! Сегодня я хочу поделиться с вами, как я решал проблемы с переносом сайта WordPress с HTTP на HTTPS. Пришлось перелопатить много информации и перепробовать много методов, чтобы найти тот, который подошел для моего сайта. Я покажу, что я делал и какие советы помогли именно для моего сайта на WordPress.

Правильная настройка файла wp-config.php

Первое, что мне помогло настроить работу сайта с SSL сертификатом это правильно прописанный файл wp-config.php.

$_SERVER['HTTPS'] = 'on'; // это добавляется в самое начало файла (после <?php )

...

define('FORCE_SSL_ADMIN', true); // эти строчки добавляются после всех "define" до текста: "/* Это всё, дальше не редактируем. Успехов! */"
define('FORCE_SSL_LOGIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

Когда я дописал в файле wp-config.php только одну строку: «define(‘FORCE_SSL_ADMIN’, true);» у меня появилась такая ошибка:

ERR_TOO_MANY_REDIRECTS

Изменение путей к картинкам сайта

Затем я поменял настройки WordPress на панели по адресу:

Настройки -> Общие -> Адрес сайта и Адрес WordPress

У меня были проблемы с путями у картинок, поэтому я воспользовался плагином Velvet Blues Update URLs. И заменил http://site.softmaker.kz на https://site.softmaker.kz с его помощью. Кроме того, воспользовался скриптами MySql, чтобы в базе поменять все пути:

UPDATE wp_postmeta
SET meta_value=(REPLACE (meta_value, 'iframe src="http://','iframe src="//'));


UPDATE wp_posts
SET   post_content = ( Replace (post_content, "src='https://", "src='//") )
WHERE  Instr(post_content, 'jpeg') > 0
        OR Instr(post_content, 'jpg') > 0
        OR Instr(post_content, 'gif') > 0
        OR Instr(post_content, 'png') > 0;


UPDATE wp_posts
SET    post_content = ( Replace (post_content, 'src="http://', 'src="//') )
WHERE  Instr(post_content, 'jpeg') > 0
        OR Instr(post_content, 'jpg') > 0
        OR Instr(post_content, 'gif') > 0
        OR Instr(post_content, 'png') > 0;


UPDATE wp_options SET option_value = REPLACE(option_value, 'http://site.softmaker.kz', 'https://site.softmaker.kz') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://site.softmaker.kz', 'https://site.softmaker.kz');
UPDATE wp_postmeta SET meta_value = REPLACE (meta_value, 'http://site.softmaker.kz','https://site.softmaker.kz');
UPDATE wp_comments SET comment_content = REPLACE (comment_content, 'http://site.softmaker.kz', 'https://site.softmaker.kz');
UPDATE wp_comments SET comment_author_url = REPLACE (comment_author_url, 'http://site.softmaker.kz', 'https://site.softmaker.kz');

Переадресация страниц с HTTP на HTTPS

Чтобы сделать постоянную переадресацию страниц с HTTP на HTTPS я воспользовался возможностью, которую предоставляет Cloudflare. На панели Cloudflare есть два способа настроить использование HTTPS. Я воспользовался вторым, так как он оказался более гибким для моего случая.

  1. SSL/TLS -> Edge Certificates -> Always Use HTTPS -> ON
  2. Page Rules -> Create Page Rule -> site.softmaker.kz/* -> Always Use HTTPS (* — означает, что перенаправление для всех страниц, только три бесплатных правила возможны)

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

# BEGIN WordPress


RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]


# END WordPress

Или кому-то больше подойдет другой вариант:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]
SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>

Больше о том, как настраивать файл .htaccess можно прочитать в этой статье.

Исправление ошибки, связанной со смешанным контентом сайта

И последнее, что мне не давало полностью перейти на безопасное соединение через SSL на HTTPS это смешанный контент сайта или mixed content. Об этом, например, браузер Firefox сообщает в адресной строке. Моей проблемой была, одна ссылка на картинку через незащищенный http протокол.

Firefox сообщал:

Подключение к сайту защищено не полностью

Чтобы понять, какие элементы передаются по незащищенному http протоколу я открыл консоль браузера.

Правая кнопка мыши, находясь на странице сайта -> «Просмотреть код» -> «Исследовать элемент»/«Inspect elements». Также можно воспользоваться клавишей F12.

На вкладке Console я увидел ошибки на странице сайта, найденные браузером. В поле filter набрал «Mixed Content» (как это сделать показано в видео в конце статьи). В них была указана ссылка на элемент, подгружающийся по незащищенному http протоколу, в моем случае это была ссылка:

http://site.softmaker.kz/wp-content/themes/enfold//images/background-images/floral-dark.png

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

  • Выбрал свою БД.
  • Убедился, что выбрал БД (т.е. не таблицу, иначе бы получил совершенно другой диалог поиска).
  • Нажал на вкладку «Поиск».
  • Выбрал нужный мне поисковый запрос.
  • Выбрал все таблицы для поиска.

В итоге ничего не нашел. У меня была локальная копия моего сайта WordPress, поэтому я решил выполнить поиск по всем файлам и нашел, что в одном из php файлов оказалась такая строка:

'colorset-alternate_color-img'            => AVIA_BASE_URL."images/background-images/floral-dark.png",

Поэтому я решил зайти в административную панель моего сайта WordPress через протокол HTTPS. Затем я открыл настройки моей темы и изменил некоторые из них. Потом сохранил эти настройки и очистил кэш, который был создан плагином для создания кэша сайта. После этих манипуляция сайт исправно заработал через защищенный протокол HTTPS!