Impostare $_SERVER['HTTPS']='on' impedisce l'accesso a wp-admin

23 dic 2016, 22:20:37
Visualizzazioni: 31.9K
Voti: 20

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.

3
Commenti

Non dici molto riguardo al resto della tua configurazione. Hai impostato define('FORCE_SSL_ADMIN', true);

user42826 user42826
23 dic 2016 23:57:06

Non ho definito 'FORCE_SSL_ADMIN'. Proverò a farlo.

nu everest nu everest
24 dic 2016 03:30:34

devi verificare che i cookie https vengano inviati anche dal load balancer tramite http. Sembra che non vengano inviati. Ovviamente anche il contrario deve essere verificato: i cookie che imposti vengono trasferiti tramite https

Mark Kaplun Mark Kaplun
24 dic 2016 05:49:55
Tutte le risposte alla domanda 1
6
28

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';
}
24 dic 2016 03:59:27
Commenti

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 user42826
24 dic 2016 05:02:41

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

nu everest nu everest
24 dic 2016 17:32:20

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.

user42826 user42826
25 dic 2016 20:42:58

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

Aaroninus Aaroninus
14 set 2017 19:02:02

@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

baptx baptx
21 dic 2017 14:33:25

Ha funzionato sull'istanza Amazon. Stavo avendo difficoltà ma spostare il codice in cima ha risolto il problema.

Krishnadas PC Krishnadas PC
11 set 2018 11:36:23
Mostra i restanti 1 commenti