La définition de $ _SERVER ['HTTPS'] = 'on' empêche l'accès à wp-admin

16

Tout d'abord, mon serveur est assis derrière un équilibreur de charge. Mon certificat SSL se trouve sur l'équilibreur de charge et gère HTTPS. Les données entrant sur le port 443 sont transmises au serveur Wordpress en utilisant HTTP sur le port 80.

Cependant, wordpress et php ne connaissent pas la configuration de mon serveur. Cela fait que le navigateur se méfie de la validité de mon certificat SSL valide.

Pour résoudre ce problème, j'ai ajouté le code suivant à functions.php. J'ai trouvé ce code ici et le codex est d'accord .

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

Cela fonctionne très bien pour le frontend, mais maintenant / wp-admin / est inaccessible même avec mon compte Admin. Une fois connecté, je reçois un message: "Désolé, vous n'êtes pas autorisé à accéder à cette page." Aucune autre aide n'est fournie.

J'ai donc cherché dans le dossier wp-admin et découvert que les mots "Désolé, vous n'êtes pas autorisé à accéder à cette page." apparaissent 17 fois différents.

La plupart de ces messages d'erreur sont associés à une vérification des autorisations utilisateur.

Comment puis-je garder HTTPS activé et conserver l'accès administrateur?

Sommaire:

  • Avant d'ajouter la logique HTTP_X_FORWARDED_PROTO à functions.php, je peux accéder à wp-admin /
  • Après avoir ajouté la logique HTTP_X_FORWARDED_PROTO à functions.php, je ne peux pas accéder à wp-admin /
  • Après avoir supprimé la logique HTTP_X_FORWARDED_PROTO dans functions.php, je ne peux pas accéder à wp-admin /

MISE À JOUR:

J'ai découvert que le message d'erreur provient de wp-admin / menu.php et de ce morceau de code en bas. J'ai ajouté menu.phpà la fin de l'erreur pour comprendre qu'il s'agissait de ce fichier.

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

Je ne comprends toujours pas comment résoudre ce problème.

nu everest
la source
1
Vous ne dites pas grand-chose sur le reste de votre configuration. Avez-vous définidefine('FORCE_SSL_ADMIN', true);
user42826
Je n'ai pas défini "FORCE_SSL_ADMIN". Je vais essayer.
nu everest
vous devez vérifier que les cookies https sont également envoyés depuis l'équilibreur de charge via http. Il semble qu'ils ne soient pas envoyés. Évidemment, l'inverse doit également être vérifié, les cookies que vous définissez sont-ils transférés via https
Mark Kaplun

Réponses:

19

Un merci spécial à user42826.

Selon le codex:

Si WordPress est hébergé derrière un proxy inverse qui fournit SSL, mais est lui-même hébergé sans SSL, ces options enverront initialement toutes les demandes dans une boucle de redirection infinie. Pour éviter cela, vous pouvez configurer WordPress pour reconnaître l'en-tête HTTP_X_FORWARDED_PROTO (en supposant que vous avez correctement configuré le proxy inverse pour définir cet en-tête).

Les actions suivantes résoudront le problème.

Ajoutez ceci à wp-config.php. ( référence codex )

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

Supprimez-le de functions.php car il n'est pas nécessaire.

/**
 * 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';
}
nu everest
la source
1
La raison en est que les cookies de sessions sécurisées sont perdus lorsqu'ils se trouvent derrière l'équilibreur de charge car LB fait SSL mais le backend est du http simple. Ravi de voir d'autres personnes travailler sur des architectures au niveau de l'entreprise;)
user42826
@ user42826 Ce qui est bien avec cette configuration, c'est que je peux simplement commenter FORCE_SSL_ADMIN si je veux interdire l'accès administrateur, ou y a-t-il d'autres effets secondaires qui devraient me pousser à reconsidérer cette ligne de pensée?
nu everest
1
Dans votre configuration, il semble que le fait de ne pas définir FORCE_SSL_ADMIN empêche l'accès administrateur, mais il existe de meilleures façons de le faire en fonction de vos besoins. Exemples: empêcher l'accès à wp-admin ou wp-login.php dans .htaccess ou apache config, supprimer l'authentification native WP via le plugin, ré-architecturer WP afin que l'url wp-admin soit différente de l'url publique, etc.
user42826
6
Assurez-vous d'ajouter ce code avant la require_once(ABSPATH . 'wp-settings.php');ligne. Un merci spécial à jtl dans cette réponse.
Aaroninus
@Aaroninus merci, j'utilise Cloudflare flexible SSL et sans votre commentaire j'aurais passé du temps à chercher à nouveau. J'ai trouvé cette question connexe précédemment: wordpress.stackexchange.com/questions/170165/…
baptx