Setarea $_SERVER['HTTPS']='on' împiedică accesul la wp-admin

23 dec. 2016, 22:20:37
Vizualizări: 31.9K
Voturi: 20

În primul rând, serverul meu se află în spatele unui load balancer. Certificatul SSL este instalat pe load balancer și gestionează HTTPS. Datele care vin pe portul 443 sunt redirecționate către serverul WordPress folosind HTTP pe portul 80.

Cu toate acestea, WordPress și PHP nu cunosc configurația serverului meu. Acest lucru face ca browserul să devină suspicios cu privire la validitatea certificatului meu SSL valid.

Pentru a rezolva acest lucru, am adăugat următorul cod în functions.php. Am găsit acest cod aici și codexul confirmă.

/**
 * Facem PHP să detecteze HTTPS prin HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

Acest lucru funcționează perfect pentru frontend, dar acum /wp-admin/ nu mai este accesibil nici măcar cu contul meu de Administrator. După autentificare primesc mesajul "Ne pare rău, nu aveți permisiunea să accesați această pagină." Nu este oferită nicio altă informație.

Așa că am căutat prin folderul wp-admin și am descoperit că textul "Ne pare rău, nu aveți permisiunea să accesați această pagină." apare de 17 ori în diferite locuri.

Majoritatea acestor mesaje de eroare sunt asociate cu o verificare a permisiunilor utilizatorului.

Cum pot păstra HTTPS 'on' și să mențin accesul de administrator?

Sumar:

  • Înainte de a adăuga logica HTTP_X_FORWARDED_PROTO în functions.php pot accesa wp-admin/
  • După adăugarea logicii HTTP_X_FORWARDED_PROTO în functions.php nu pot accesa wp-admin/
  • După eliminarea logicii HTTP_X_FORWARDED_PROTO din functions.php nu pot accesa wp-admin/

ACTUALIZARE:

Am descoperit că mesajul de eroare provine din wp-admin/menu.php și acest fragment de cod de la final. Am adăugat menu.php la sfârșitul erorii pentru a determina că era acest fișier.

if ( !user_can_access_admin_page() ) {

    /**
     * Se declanșează când accesul la o pagină de administrare este refuzat.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Ne pare rău, nu aveți permisiunea să accesați această pagină. menu.php'), 403 );
}

Tot nu înțeleg cum să rezolv această problemă.

3
Comentarii

Nu spui prea multe despre restul configurației tale. Ai setat define('FORCE_SSL_ADMIN', true);

user42826 user42826
23 dec. 2016 23:57:06

Nu am definit 'FORCE_SSL_ADMIN'. O să încerc.

nu everest nu everest
24 dec. 2016 03:30:34

trebuie să verifici dacă cookie-urile https sunt trimise și de la load balancer prin http. Se pare că nu sunt trimise. Evident, trebuie verificat și invers, dacă cookie-urile pe care le setezi sunt transferate prin https

Mark Kaplun Mark Kaplun
24 dec. 2016 05:49:55
Toate răspunsurile la întrebare 1
6
28

Mulțumiri speciale utilizatorului user42826.

Conform codex-ului:

Dacă WordPress este găzduit în spatele unui proxy invers care furnizează SSL, dar este găzduit fără SSL, aceste opțiuni vor trimite inițial orice cerere într-o buclă de redire infinită. Pentru a evita acest lucru, puteți configura WordPress să recunoască antetul HTTP_X_FORWARDED_PROTO (presupunând că ați configurat corect proxy-ul invers pentru a seta acel antet).

Următoarele acțiuni vor rezolva problema.

Înainte de require_once( ABSPATH . 'wp-settings.php' );, adăugați acest cod în wp-config.php. (referință codex)

/* Setări SSL */
define('FORCE_SSL_ADMIN', true);

/* Activează HTTPS 'on' dacă HTTP_X_FORWARDED_PROTO este 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

Eliminați acest cod din functions.php deoarece este inutil.

/**
 * Face PHP conștient de HTTPS prin HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}
24 dec. 2016 03:59:27
Comentarii

Motivul este că cookie-urile de sesiune securizate se pierd în spatele load balancer-ului deoarece LB face SSL dar backend-ul folosește http simplu. Frumos să văd alții lucrând la arhitecturi de nivel enterprise ;)

user42826 user42826
24 dec. 2016 05:02:41

@user42826 Ce este frumos la această configurație este că pot pur și simplu să comentez FORCE_SSL_ADMIN dacă vreau să interzic accesul în admin, sau există alte efecte secundare care ar trebui să mă facă să reconsider această linie de gândire?

nu everest nu everest
24 dec. 2016 17:32:20

În configurația ta, se pare că neconfigurarea FORCE_SSL_ADMIN blochează accesul în admin, dar există modalități mai bune de a face asta în funcție de cerințele tale. Exemple: blochează accesul la wp-admin sau wp-login.php în .htaccess sau configurația Apache, elimină autentificarea nativă WP prin plugin, re-arhitecturare WP astfel încât URL-ul wp-admin să fie diferit de URL-ul public, etc.

user42826 user42826
25 dec. 2016 20:42:58

Asigurați-vă că adăugați acest cod înainte de linia require_once(ABSPATH . 'wp-settings.php');. Mulțumiri speciale lui jtl în acest răspuns.

Aaroninus Aaroninus
14 sept. 2017 19:02:02

@Aaroninus mulțumesc, eu folosesc Cloudflare flexible SSL și fără comentariul tău aș fi pierdut timpul căutând din nou. Am găsit anterior această întrebare înrudită: https://wordpress.stackexchange.com/questions/170165/wordpress-wp-admin-https-redirect-loop

baptx baptx
21 dec. 2017 14:33:25

A funcționat pe instanța Amazon. M-am chinuit, dar mutarea codului în partea de sus a rezolvat problema.

Krishnadas PC Krishnadas PC
11 sept. 2018 11:36:23
Arată celelalte 1 comentarii