Настройка $_SERVER['HTTPS']='on' блокирует доступ к wp-admin

23 дек. 2016 г., 22:20:37
Просмотры: 31.9K
Голосов: 20

Прежде всего, мой сервер находится за балансировщиком нагрузки. 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 );
}

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

3
Комментарии

Вы мало говорите о остальной части вашей конфигурации. Вы установили define('FORCE_SSL_ADMIN', true);

user42826 user42826
23 дек. 2016 г. 23:57:06

Я не определял 'FORCE_SSL_ADMIN'. Я попробую это.

nu everest nu everest
24 дек. 2016 г. 03:30:34

вам нужно проверить, что HTTPS-куки также отправляются с балансировщика нагрузки по HTTP. Похоже, они не отправляются. Очевидно, также нужно проверить обратное — передаются ли куки, которые вы устанавливаете, по HTTPS

Mark Kaplun Mark Kaplun
24 дек. 2016 г. 05:49:55
Все ответы на вопрос 1
6
28

Особая благодарность пользователю 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';
}
24 дек. 2016 г. 03:59:27
Комментарии

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

user42826 user42826
24 дек. 2016 г. 05:02:41

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

nu everest nu everest
24 дек. 2016 г. 17:32:20

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

user42826 user42826
25 дек. 2016 г. 20:42:58

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

Aaroninus Aaroninus
14 сент. 2017 г. 19:02:02

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

baptx baptx
21 дек. 2017 г. 14:33:25

Сработало на амазоновском инстансе. Боролся с перемещением кода вверх, и это сработало.

Krishnadas PC Krishnadas PC
11 сент. 2018 г. 11:36:23
Показать остальные 1 комментариев