Вопрос или проблема
Я хочу запустить WordPress за SSL-терминированным haproxy. Но я не могу это сделать, потому что есть смешанное содержимое (http). Все файлы CSS загружаются через http.
Это моя конфигурация haproxy.
backend test_example_com
mode http
option forwardfor
balance roundrobin
http-request set-header X-Forwarded-Proto %[dst_port]
server example 172.29.1.26:80 check
Это мой wp-config.php
/* Добавьте любые пользовательские значения между этой строкой и строкой "остановите редактирование". */
define( 'FORCE_SSL_ADMIN', true );
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if( false !== strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) ) {
$_SERVER['HTTPS'] = 'on';
}
define( 'WP_HOME', 'https://test.example.com' );
define( 'WP_SITEURL', 'https://test.example.com' );
define('.COOKIE_DOMAIN.', 'test.example.com');
define('.SITECOOKIEPATH.', '.');
define('WP_CONTENT_URL', 'https://test.example.com/wp-content');
$_SERVER['HTTP_HOST'] = 'test.example.com';
$_SERVER['REMOTE_ADDR'] = 'https://test.example.com';
$_SERVER[ 'SERVER_ADDR' ] = 'test.example.com';
/* На этом все, остановите редактирование! Удачной публикации. */
/** Абсолютный путь к директории WordPress. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . "https://wordpress.stackexchange.com/" );
}
/** Настраивает переменные WordPress и включенные файлы. */
require_once ABSPATH . 'wp-settings.php';
Вот журнал консоли моего браузера
Смешанное содержимое: Страница по адресу 'https://test.example.com/wp-admin/' загружена через HTTPS, но запрашивала небезопасный стилист 'http://test.example.com/wp-admin/load-styles.php?c=0&dir=ltr&load%5Bchunk_0%5D=dashicons,admin-bar,common,forms,admin-menu,dashboard,list-tables,edit,revisions,media,themes,about,nav-menus,wp-pointer,widgets&load%5Bchunk_1%5D=,site-icon,l10n,buttons,wp-auth-check&ver=6.3'. Этот запрос был заблокирован; содержимое должно быть обслужено через HTTPS.
test.example.com/:152 Смешанное содержимое: Страница по адресу 'https://test.example.com/wp-admin/' загружена через HTTPS, но запрашивала небезопасный стилист 'http://test.example.com/wp-includes/js/thickbox/thickbox.css?ver=6.3'. Этот запрос был заблокирован; содержимое должно быть обслужено через HTTPS.
28Смешанное содержимое: Страница по адресу '<URL>' загружена через HTTPS, но запрашивала небезопасный скрипт '<URL>'. Этот запрос был заблокирован; содержимое должно быть обслужено через HTTPS.
(index):168 Uncaught DOMException: Не удалось выполнить 'replaceState' в 'History': объект состояния истории с URL 'http://test.example.com/wp-admin/' не может быть создан в документе с источником 'https://test.example.com' и URL 'https://test.example.com/wp-admin/'.
в https://test.example.com/wp-admin/:168:19
Может кто-нибудь сказать, как избавиться от смешанного содержимого?
Пожалуйста, помогите.
Я нашел вашу публикацию, искал похожее решение. У меня настроен haproxy, и я тоже пытаюсь установить WordPress на сервере за кулисами.
Я нашел эту страницу: https://www.wpbeginner.com/plugins/how-to-fix-the-mixed-content-error-in-wordpress-step-by-step/, где подробно описаны некоторые настройки HTTPS, которые вы можете изменить в настройках WordPress, чтобы это исправить.
Для haproxy, глядя на вашу конфигурацию, вы, вероятно, хотите, чтобы метод обнаружения SSL был опцией X_FORWARDED_FOR_PROTO. Я не уверен, какая опция будет работать лучше для исправления небезопасного содержимого SSL, но я бы начал с простой и постепенно повышал уровень.
Для себя, когда я переустановлю, я, вероятно, перейду в корень сайта WordPress, затем сделаю grep http:// и заменю его на https:// с помощью sed. Я не могу поручиться за этот метод, и он также не будет применим к любым плагинам или темам, если вы не повторите этот метод снова после их установки.
Ответ или решение
Если вы хотите развернуть WordPress за SSL-терминированным HAProxy и столкнулись с проблемой смешанного контента, важно правильно настроить как конфигурацию HAProxy, так и параметры вашего WordPress. Рассмотрим все аспекты, которые могут помочь решить данную проблему.
Настройка конфигурации HAProxy
Ваш текущий конфигурационный файл HAProxy для бэкенда выглядит следующим образом:
backend test_example_com
mode http
option forwardfor
balance roundrobin
http-request set-header X-Forwarded-Proto %[dst_port]
server example 172.29.1.26:80 check
Вам необходимо изменить параметр X-Forwarded-Proto
, чтобы HAProxy правильно информировал сервер о том, что соединение является защищенным (HTTPS). Вместо использования переменной %[dst_port]
, укажите протокол. Вот измененный вариант:
backend test_example_com
mode http
option forwardfor
balance roundrobin
http-request set-header X-Forwarded-Proto https
server example 172.29.1.26:80 check
Настройка wp-config.php
Теперь рассмотрим ваш файл wp-config.php
. Вы уже настроили несколько параметров, но некоторые строки можно улучшить. Убедитесь, что сервер корректно обрабатывает переменные заголовков:
define( 'FORCE_SSL_ADMIN', true );
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
define( 'WP_HOME', 'https://test.example.com' );
define( 'WP_SITEURL', 'https://test.example.com' );
define( 'COOKIE_DOMAIN', 'test.example.com' );
define( 'SITECOOKIEPATH', '/' );
define( 'WP_CONTENT_URL', 'https://test.example.com/wp-content' );
// Убедитесь, что HTTP_HOST корректно установлен
$_SERVER['HTTP_HOST'] = 'test.example.com';
// Этот параметр не нужен и может вызвать путаницу
// $_SERVER['REMOTE_ADDR'] = 'https://test.example.com';
// Прямо определить абсолютный путь к WordPress не нужно делать так
define( 'ABSPATH', __DIR__ . '/' );
require_once ABSPATH . 'wp-settings.php';
Устранение смешанного контента
Основная проблема с смешанным контентом возникает из-за того, что некоторые ресурсы запрашиваются по протоколу HTTP, а не HTTPS. Чтобы устранить эту проблему, рассмотрите следующие шаги:
-
Используйте плагин для исправления смешанного контента: Плагин, такой как Really Simple SSL или SSL Insecure Content Fixer, может автоматически помочь в решении проблемы смешанного контента.
-
Обновите URL-адреса: Если у вас есть ссылки на старые HTTP-ресурсы в базе данных (например, изображения или стили), используйте команду
search and replace
для обновления их на HTTPS:wp search-replace 'http://test.example.com' 'https://test.example.com' --skip-columns=guid
-
Проверка плагинов и тем: Убедитесь, что ваши плагины и темы также соответствуют стандартам HTTPS. Обновите их настройки, если они ссылаются на неоправданные HTTP-ресурсы.
-
Проверка и аудит: Используйте инструменты для проверки безопасности, такие как Why No Padlock?, чтобы найти источники смешанного контента и устранить их.
Заключение
Настройка WordPress за HAProxy с SSL может потребовать некоторых усилий, особенно в контексте смешанного контента. Следуя вышеуказанным рекомендациям, вы сможете устранить проблемы и обеспечить безопасное соединение для ваших пользователей. Оптимальная конфигурация HAProxy и корректно настроенный wp-config.php
сыграет ключевую роль в успехе этого процесса.