Встановлення $ _SERVER ['HTTPS'] = 'on' перешкоджає доступу до wp-admin


16

По-перше, мій сервер сидить за балансиром навантаження. Мій сертифікат SSL сидить на балансирі навантаження та обробляє HTTPS. Дані, що надходять на порт 443, передаються на сервер Wordpress за допомогою HTTP на порт 80.

Однак wordpress та php не знають моєї конфігурації сервера. Це призводить до того, що браузер підозріло ставиться до дійсності мого дійсного сертифіката SSL.

Щоб виправити це, я додав наступний код до function.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 до функцій.php, я можу отримати доступ до wp-admin /
  • Після додавання логіки HTTP_X_FORWARDED_PROTO до function.php я не можу отримати доступ до wp-admin /
  • Після видалення логіки HTTP_X_FORWARDED_PROTO до function.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". Я спробую.
nu everest

вам потрібно перевірити, що куки https також надсилаються з балансира завантаження через http. Це здається, що їх не надсилають. Очевидно також, що потрібно навпаки перевірити, чи передаються встановлені вами файли cookie через https
Mark Kaplun

Відповіді:


19

Особлива подяка користувачеві42826.

Відповідно до кодексу:

Якщо 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';
}

Видаліть це з function.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, якщо хочу заборонити доступ адміністратора, чи є інші побічні ефекти, які повинні змусити мене переглянути цю думку?
nu everest

1
У вашому налаштуванні це здається, що невстановлення FORCE_SSL_ADMIN перешкоджає доступу адміністратора, але є кращі способи зробити це залежно від ваших вимог. Приклади: запобігання доступу wp-admin або wp-login.php у .htaccess або apache config, видалення нативної автентифікації WP за допомогою плагіна, реконструкція WP, щоб URL-адреса wp-admin відрізнялася від загальнодоступної URL-адреси тощо
user42826

6
Обов’язково додайте цей код перед require_once(ABSPATH . 'wp-settings.php');рядком. Особлива подяка jtl у цій відповіді.
Ааронін

@Aaroninus дякую, я використовую Cloudflare гнучкий SSL і без вашого коментаря я витратив би час на пошуки ще раз. Раніше це питання я знайшов: wordpress.stackexchange.com/questions/170165/…
baptx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.