Решение проблем при переносе сайта WordPress с HTTP на HTTPS
Добрый день, уважаемые друзья! Сегодня я хочу поделиться с вами, как я решал проблемы с переносом сайта WordPress с HTTP на HTTPS. Пришлось перелопатить много информации и перепробовать много методов, чтобы найти тот, который подошел для моего сайта. Я покажу, что я делал и какие советы помогли именно для моего сайта на WordPress.
- Правильная настройка файла wp-config.php
- Изменение путей к картинкам сайта
- Переадресация страниц с HTTP на HTTPS
- Исправление ошибки, связанной со смешанным контентом сайта
Правильная настройка файла 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. Я воспользовался вторым, так как он оказался более гибким для моего случая.
- SSL/TLS -> Edge Certificates -> Always Use HTTPS -> ON
- 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!