Установка $ _SERVER ['HTTPS'] = 'on' запрещает доступ к wp-admin

16

Сначала мой сервер сидит за балансировщиком нагрузки. Мой SSL-сертификат находится на балансировщике нагрузки и обрабатывает HTTPS. Данные, поступающие на порт 443, перенаправляются на сервер Wordpress с использованием HTTP на порт 80.

Тем не менее, WordPress и PHP не знают конфигурацию моего сервера. Это заставляет браузер с подозрением относиться к действительности моего действующего SSL-сертификата.

Чтобы исправить это, я добавил следующий код в functions.php. Я нашел этот код здесь, и кодекс согласен .

/**
 * Make PHP HTTPS aware via 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 включенным и сохранить доступ администратора?

Резюме:

  • Перед добавлением логики 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() ) {

    /**
     * Fires when access to an admin page is denied.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Sorry, you are not allowed to access this page. menu.php'), 403 );
}

Я до сих пор не понимаю, как это исправить.

Ну Эверест
источник
1
Вы не много говорите об остальной части вашей конфигурации. Вы установилиdefine('FORCE_SSL_ADMIN', true);
user42826
Я не определил «FORCE_SSL_ADMIN». Я попробую.
Ню Эверест
Вам необходимо убедиться, что файлы cookie https также отправляются с балансировщика нагрузки через http. Похоже, они не отправлены. Очевидно, что необходимо проверить и обратный путь: передаются ли установленные вами файлы cookie по протоколу https
Марк Каплун

Ответы:

19

Отдельное спасибо user42826.

Согласно кодексу:

Если WordPress размещен за обратным прокси-сервером, который предоставляет SSL, но размещен без SSL, эти параметры первоначально отправят любые запросы в бесконечный цикл перенаправления. Чтобы избежать этого, вы можете настроить WordPress на распознавание заголовка HTTP_X_FORWARDED_PROTO (при условии, что вы правильно настроили обратный прокси-сервер для установки этого заголовка).

Следующие действия решат проблему.

Добавьте это в wp-config.php. ( ссылка на кодекс )

/* SSL Settings */
define('FORCE_SSL_ADMIN', true);

/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

Удалите это из functions.php, так как это не нужно.

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}
Ну Эверест
источник
1
Причина в том, что cookie-файлы защищенных сессий теряются, когда они находятся за балансировщиком нагрузки, потому что LB выполняет SSL, а бэкэнд - простой http. Приятно видеть, что другие работают над архитектурами уровня предприятия;)
user42826
@ user42826 Что приятно в этой настройке, так это то, что я могу просто закомментировать FORCE_SSL_ADMIN, если я хочу запретить доступ администратора, или есть другие побочные эффекты, которые должны побудить меня пересмотреть эту точку зрения?
Ню Эверест
1
В вашей настройке это звучит так, как будто настройка FORCE_SSL_ADMIN не разрешает доступ администратора, но есть более эффективные способы сделать это в зависимости от ваших требований. Примеры: запретить доступ wp-admin или wp-login.php в .htaccess или apache config, удалить собственную аутентификацию WP с помощью плагина, ре-архитектуру WP, чтобы URL-адрес wp-admin отличался от общедоступного, и т. Д.
user42826
6
Обязательно добавьте этот код перед require_once(ABSPATH . 'wp-settings.php');строкой. Отдельное спасибо jtl в этом ответе.
Ааронин
@Aaroninus спасибо, я использую Cloudflare Flexible SSL и без вашего комментария я бы потратил время на поиск снова. Я нашел этот связанный вопрос ранее: wordpress.stackexchange.com/questions/170165/…
baptx