Setarea $_SERVER['HTTPS']='on' împiedică accesul la wp-admin
Î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ă.

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

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 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?

Î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.

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 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
