Establecer $ _SERVER ['HTTPS'] = 'on' evita el acceso a wp-admin

16

Primero, mi servidor está sentado detrás de un equilibrador de carga. Mi certificado SSL se encuentra en el equilibrador de carga y maneja HTTPS. Los datos que ingresan en el puerto 443 se envían al servidor de Wordpress usando HTTP en el puerto 80.

Sin embargo, WordPress y PHP no conocen la configuración de mi servidor. Esto hace que el navegador sospeche de la validez de mi certificado SSL válido.

Para solucionar esto, agregué el siguiente código a functions.php. Encontré este código aquí y el códice está de acuerdo .

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

Esto funciona muy bien para la interfaz, pero ahora / wp-admin / es inaccesible incluso con mi cuenta de administrador. Después de iniciar sesión, recibo un mensaje, "Lo siento, no puedes acceder a esta página". No se proporciona ninguna otra ayuda.

Así que busqué en la carpeta wp-admin y descubrí que las palabras "Lo siento, no puedes acceder a esta página". aparecen 17 veces diferentes.

La mayoría de estos mensajes de error están asociados con una verificación de permisos de usuario.

¿Cómo mantengo HTTPS 'activado' y conservo el acceso de administrador?

Resumen:

  • Antes de agregar la lógica HTTP_X_FORWARDED_PROTO a functions.php, puedo acceder a wp-admin /
  • Después de agregar la lógica HTTP_X_FORWARDED_PROTO a functions.php, no puedo acceder a wp-admin /
  • Después de eliminar la lógica HTTP_X_FORWARDED_PROTO a functions.php, no puedo acceder a wp-admin /

ACTUALIZAR:

Descubrí que el mensaje de error proviene de wp-admin / menu.php y esta porción de código en la parte inferior. Agregué menu.phpal final del error para descubrir que era este archivo.

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

Todavía no entiendo cómo solucionar esto.

nu everest
fuente
1
No dice mucho sobre el resto de su configuración. ¿Configuródefine('FORCE_SSL_ADMIN', true);
User42826
No definí 'FORCE_SSL_ADMIN'. Voy a intentarlo.
nu everest
debe verificar que las cookies https también se envíen desde el equilibrador de carga a través de http. Parece que no se envían. Obviamente, al revés también debe verificarse, son las cookies que configuras se transfieren a través de https
Mark Kaplun

Respuestas:

19

Un agradecimiento especial a user42826.

Según el códice:

Si WordPress está alojado detrás de un proxy inverso que proporciona SSL, pero está alojado sin SSL, estas opciones enviarán inicialmente cualquier solicitud a un bucle de redireccionamiento infinito. Para evitar esto, puede configurar WordPress para reconocer el encabezado HTTP_X_FORWARDED_PROTO (suponiendo que haya configurado correctamente el proxy inverso para establecer ese encabezado).

Las siguientes acciones resolverán el problema.

Agregue esto a wp-config.php. ( referencia del códice )

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

Elimine esto de functions.php ya que es innecesario.

/**
 * 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
fuente
1
La razón es que las cookies de sesiones seguras se pierden cuando están detrás del equilibrador de carga porque LB está haciendo SSL pero el backend es http simple. Es bueno ver a otros trabajando en arquitecturas de nivel empresarial;)
user42826
@ user42826 Lo bueno de esta configuración es que puedo comentar FORCE_SSL_ADMIN si quiero prohibir el acceso del administrador, o ¿hay otros efectos secundarios que deberían hacerme reconsiderar esta línea de pensamiento?
nu everest
1
En su configuración, parece que no configurar FORCE_SSL_ADMIN impide el acceso del administrador, pero hay mejores formas de hacerlo dependiendo de sus requisitos. Ejemplos: impiden wp-admin o wp-login.php acceso en .htaccess o de configuración de Apache, la autenticación nativa quitar WP a través de plug-in, re-arquitectura de WP para que wp-admin url es diferente a la dirección URL pública, etc
user42826
66
Asegúrese de agregar este código antes de la require_once(ABSPATH . 'wp-settings.php');línea. Un agradecimiento especial a jtl en esta respuesta.
Aaroninus
@Aaroninus gracias, uso SSL flexible de Cloudflare y sin tu comentario hubiera pasado tiempo buscando de nuevo. Encontré esta pregunta relacionada anteriormente: wordpress.stackexchange.com/questions/170165/…
baptx