Impostare $_SERVER['HTTPS']='on' impedisce l'accesso a wp-admin
Il mio server si trova dietro un load balancer. Il certificato SSL risiede sul load balancer e gestisce HTTPS. I dati in arrivo sulla porta 443 vengono inoltrati al server WordPress utilizzando HTTP sulla porta 80.
Tuttavia, WordPress e PHP non conoscono la mia configurazione del server. Questo fa sì che il browser diventi sospettoso sulla validità del mio certificato SSL valido.
Per risolvere questo problema ho aggiunto il seguente codice a functions.php. Ho trovato questo codice qui e il codex lo conferma.
/**
* Rendere PHP consapevole di HTTPS tramite HTTP_X_FORWARDED_PROTO
*/
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS']='on';
}
Questo funziona benissimo per il frontend, ma ora /wp-admin/ non è accessibile nemmeno con il mio account Admin. Dopo l'accesso ricevo un messaggio: "Spiacenti, non sei autorizzato ad accedere a questa pagina." Non viene fornito altro aiuto.
Ho cercato nella cartella wp-admin e ho scoperto che le parole "Spiacenti, non sei autorizzato ad accedere a questa pagina" appaiono 17 volte diverse.
La maggior parte di questi messaggi di errore sono associati a un controllo dei permessi utente.
Come posso mantenere HTTPS 'on' e conservare l'accesso admin?
Riepilogo:
- Prima di aggiungere la logica HTTP_X_FORWARDED_PROTO a functions.php posso accedere a wp-admin/
- Dopo aver aggiunto la logica HTTP_X_FORWARDED_PROTO a functions.php non posso accedere a wp-admin/
- Dopo aver rimosso la logica HTTP_X_FORWARDED_PROTO da functions.php non posso accedere a wp-admin/
AGGIORNAMENTO:
Ho scoperto che il messaggio di errore proviene da wp-admin/menu.php e da questo blocco di codice in fondo. Ho aggiunto menu.php
alla fine dell'errore per capire che era questo file.
if ( !user_can_access_admin_page() ) {
/**
* Esegue l'azione quando l'accesso a una pagina admin viene negato.
*
* @since 2.5.0
*/
do_action( 'admin_page_access_denied' );
wp_die( __( 'Spiacenti, non sei autorizzato ad accedere a questa pagina. menu.php'), 403 );
}
Non capisco ancora come risolvere questo problema.
Un ringraziamento speciale all'utente42826.
Come riportato nel codex:
Se WordPress è ospitato dietro un reverse proxy che fornisce SSL, ma è ospitato senza SSL, queste opzioni inizialmente invieranno tutte le richieste in un loop di reindirizzamento infinito. Per evitare ciò, puoi configurare WordPress per riconoscere l'header HTTP_X_FORWARDED_PROTO (assumendo che tu abbia configurato correttamente il reverse proxy per impostare questo header).
Le seguenti azioni risolveranno il problema.
Prima di require_once( ABSPATH . 'wp-settings.php' );
, aggiungi questo a wp-config.php. (riferimento al codex)
/* Impostazioni SSL */
define('FORCE_SSL_ADMIN', true);
/* Attiva HTTPS 'on' se HTTP_X_FORWARDED_PROTO corrisponde a 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
Rimuovi questo da functions.php in quanto non è necessario.
/**
* Rendi PHP consapevole di HTTPS tramite HTTP_X_FORWARDED_PROTO
*/
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS']='on';
}

Il motivo è che i cookie delle sessioni sicure vanno persi quando sono dietro il load balancer perché il LB gestisce SSL ma il backend è in http normale. Bello vedere altri che lavorano su architetture di livello enterprise ;)

@user42826 La cosa bella di questa configurazione è che posso semplicemente commentare FORCE_SSL_ADMIN se voglio impedire l'accesso all'admin, o ci sono altri effetti collaterali che dovrebbero farmi riconsiderare questa linea di pensiero?

Nella tua configurazione, sembra che non impostare FORCE_SSL_ADMIN impedisca l'accesso all'admin, ma ci sono modi migliori per farlo a seconda delle tue esigenze. Esempi: impedire l'accesso a wp-admin o wp-login.php in .htaccess o nella configurazione di apache, rimuovere l'autenticazione nativa di WP tramite plugin, riprogettare WP in modo che l'URL di wp-admin sia diverso dall'URL pubblico, ecc.

Assicurati di aggiungere questo codice prima della riga require_once(ABSPATH . 'wp-settings.php');
. Un ringraziamento speciale a jtl in questa risposta.

@Aaroninus grazie, uso Cloudflare flexible SSL e senza il tuo commento avrei perso tempo a cercare ancora. Avevo già trovato questa domanda correlata: https://wordpress.stackexchange.com/questions/170165/wordpress-wp-admin-https-redirect-loop
