Ustawienie $ _SERVER ['HTTPS'] = 'on' uniemożliwia dostęp do wp-admin


16

Po pierwsze mój serwer siedzi za modułem równoważenia obciążenia. Mój certyfikat SSL znajduje się w module równoważenia obciążenia i obsługuje HTTPS. Dane przychodzące przez port 443 są przekazywane do serwera Wordpress za pomocą protokołu HTTP na porcie 80.

Jednak wordpress i php nie znają konfiguracji mojego serwera. To powoduje, że przeglądarka staje się podejrzana co do ważności mojego ważnego certyfikatu SSL.

Aby to naprawić, dodałem następujący kod do functions.php. Znalazłem ten kod tutaj i kodeks zgadza się .

/**
 * 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';
}

Działa to świetnie dla interfejsu, ale teraz / wp-admin / jest niedostępny nawet na moim koncie administratora. Po zalogowaniu otrzymuję komunikat „Niestety nie masz dostępu do tej strony”. Nie udzielono żadnej innej pomocy.

Przeszukałem więc folder wp-admin i odkryłem, że słowa „Przepraszamy, nie masz dostępu do tej strony”. pojawiają się 17 razy.

Większość tych komunikatów o błędach jest powiązanych z kontrolą uprawnień użytkownika.

Jak mogę włączyć HTTPS i zachować dostęp administratora?

Podsumowanie:

  • Przed dodaniem logiki HTTP_X_FORWARDED_PROTO do functions.php mogę uzyskać dostęp do wp-admin /
  • Po dodaniu logiki HTTP_X_FORWARDED_PROTO do functions.php nie mogę uzyskać dostępu do wp-admin /
  • Po usunięciu logiki HTTP_X_FORWARDED_PROTO do functions.php nie mogę uzyskać dostępu do wp-admin /

AKTUALIZACJA:

Odkryłem, że komunikat o błędzie pochodzi z wp-admin / menu.php i tego fragmentu kodu na dole. Dodałem menu.phpna końcu błędu, aby dowiedzieć się, że to ten plik.

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 );
}

Nadal nie rozumiem, jak to naprawić.


1
Nie mówi się wiele o reszcie konfiguracji. Czy ustawiłeśdefine('FORCE_SSL_ADMIN', true);
user42826,

Nie zdefiniowałem „FORCE_SSL_ADMIN”. Spróbuję.
nu everest

musisz sprawdzić, czy pliki cookie https są również wysyłane z modułu równoważenia obciążenia przez http. Wygląda na to, że nie zostały wysłane. Oczywiście należy również sprawdzić na odwrót, czy ustawione przez ciebie pliki cookie są przesyłane przez https
Mark Kaplun,

Odpowiedzi:


19

Specjalne podziękowania dla user42826.

Zgodnie z kodeksem:

Jeśli WordPress jest hostowany za zwrotnym serwerem proxy, który zapewnia SSL, ale jest hostowany bez SSL, te opcje początkowo wyślą wszelkie żądania w nieskończonej pętli przekierowania. Aby tego uniknąć, możesz skonfigurować WordPress do rozpoznawania nagłówka HTTP_X_FORWARDED_PROTO (zakładając, że poprawnie skonfigurowałeś odwrotne proxy do ustawienia tego nagłówka).

Poniższe działania rozwiążą problem.

Dodaj to do wp-config.php. ( odniesienie do kodeksu )

/* 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';
}

Usuń to z functions.php, ponieważ nie jest to konieczne.

/**
 * 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
Powodem jest to, że pliki cookie bezpiecznych sesji gubią się za modułem równoważenia obciążenia, ponieważ LB robi SSL, ale backend jest zwykłym http. Miło widzieć innych pracujących na architekturze na poziomie przedsiębiorstwa;)
user42826,

@ user42826 To, co jest miłego w tej konfiguracji, to to, że mogę po prostu skomentować FORCE_SSL_ADMIN, jeśli chcę zabronić dostępu dla administratorów, czy też istnieją inne skutki uboczne, które powinny skłonić mnie do ponownego przemyślenia tego sposobu myślenia?
nve everest

1
W twoim ustawieniu wygląda na to, że brak ustawienia FORCE_SSL_ADMIN uniemożliwia dostęp administratora, ale są lepsze sposoby na zrobienie tego w zależności od twoich wymagań. Przykłady: zablokuj dostęp wp-admin lub wp-login.php w konfiguracji .htaccess lub apache, usuń natywne uwierzytelnianie WP przez wtyczkę,
przebuduj

6
Dodaj ten kod przed require_once(ABSPATH . 'wp-settings.php');wierszem. Specjalne podziękowania dla jtl w tej odpowiedzi.
Aaroninus,

@Aaroninus dzięki, korzystam z elastycznego SSL Cloudflare i bez twojego komentarza spędziłbym czas na wyszukiwaniu ponownie. Znalazłem to powiązane pytanie wcześniej: wordpress.stackexchange.com/questions/170165/...
baptx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.