Настройка $_SERVER['HTTPS']='on' блокирует доступ к wp-admin
Прежде всего, мой сервер находится за балансировщиком нагрузки. SSL-сертификат установлен на балансировщике и обрабатывает HTTPS. Данные, поступающие на порт 443, перенаправляются на сервер WordPress через HTTP по порту 80.
Однако WordPress и PHP не знают о конфигурации моего сервера. Это вызывает подозрения браузера относительно действительности моего SSL-сертификата.
Чтобы исправить это, я добавил следующий код в functions.php. Я нашел этот код здесь, и кодекс это подтверждает.
/**
* Информируем PHP о HTTPS через HTTP_X_FORWARDED_PROTO
*/
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS']='on';
}
Это отлично работает для фронтенда, но теперь /wp-admin/ недоступен даже с учетной записью администратора. После входа я получаю сообщение "Извините, у вас нет доступа к этой странице." Никакой дополнительной помощи не предоставляется.
Я просмотрел папку wp-admin и обнаружил, что фраза "Извините, у вас нет доступа к этой странице" встречается 17 раз.
Большинство этих сообщений об ошибках связаны с проверкой прав пользователя.
Как сохранить HTTPS 'on' и при этом сохранить доступ администратора?
Итог:
- До добавления логики HTTP_X_FORWARDED_PROTO в functions.php я могу получить доступ к wp-admin/
- После добавления логики HTTP_X_FORWARDED_PROTO в functions.php я не могу получить доступ к wp-admin/
- После удаления логики HTTP_X_FORWARDED_PROTO из functions.php я не могу получить доступ к wp-admin/
ОБНОВЛЕНИЕ:
Я обнаружил, что сообщение об ошибке приходит из wp-admin/menu.php и этого фрагмента кода внизу. Я добавил menu.php
в конец сообщения об ошибке, чтобы определить, что это был именно этот файл.
if ( !user_can_access_admin_page() ) {
/**
* Срабатывает, когда доступ к странице администратора запрещен.
*
* @since 2.5.0
*/
do_action( 'admin_page_access_denied' );
wp_die( __( 'Извините, у вас нет доступа к этой странице. menu.php'), 403 );
}
Я все еще не понимаю, как это исправить.

Особая благодарность пользователю user42826.
Согласно кодексу:
Если WordPress размещен за обратным прокси-сервером, который предоставляет SSL, но сам хостится без SSL, эти настройки могут привести к бесконечному циклу перенаправлений. Чтобы избежать этого, можно настроить WordPress на распознавание заголовка HTTP_X_FORWARDED_PROTO (при условии, что обратный прокси-сервер правильно настроен для установки этого заголовка).
Следующие действия решат проблему.
Перед строкой require_once( ABSPATH . 'wp-settings.php' );
добавьте это в wp-config.php. (ссылка на кодекс)
/* Настройки SSL */
define('FORCE_SSL_ADMIN', true);
/* Включить HTTPS, если HTTP_X_FORWARDED_PROTO содержит 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
Удалите это из functions.php, так как это больше не требуется.
/**
* Обеспечить поддержку HTTPS через HTTP_X_FORWARDED_PROTO
*/
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS']='on';
}

Причина в том, что защищенные сессионные куки теряются при работе за балансировщиком нагрузки, так как LB выполняет SSL, а бэкенд работает по обычному http. Приятно видеть, что другие тоже работают с архитектурой уровня enterprise ;)

@user42826 Что приятно в этой настройке - я могу просто закомментировать FORCE_SSL_ADMIN, если хочу запретить доступ к админке, или есть другие побочные эффекты, которые заставят меня пересмотреть эту логику?

В вашей настройке получается, что отключение FORCE_SSL_ADMIN запрещает доступ к админке, но есть более правильные способы сделать это в зависимости от требований. Например: запретить доступ к wp-admin или wp-login.php через .htaccess или конфиг apache, отключить нативную аутентификацию WP через плагин, изменить архитектуру WP так, чтобы URL админки отличался от публичного URL и т.д.

Обязательно добавьте этот код перед строкой require_once(ABSPATH . 'wp-settings.php');
. Особая благодарность jtl за этот ответ.

@Aaroninus спасибо, я использую Cloudflare flexible SSL и без вашего комментария потратил бы время на повторные поиски. Ранее я нашел этот связанный вопрос: https://wordpress.stackexchange.com/questions/170165/wordpress-wp-admin-https-redirect-loop
