Configurar $_SERVER['HTTPS']='on' impide el acceso a wp-admin

23 dic 2016, 22:20:37
Vistas: 31.9K
Votos: 20

En primer lugar, mi servidor está detrás de un balanceador de carga. Mi certificado SSL está en el balanceador de carga y maneja HTTPS. Los datos que entran por el puerto 443 se reenvían al servidor WordPress usando HTTP en el puerto 80.

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

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

/**
 * Hacer que PHP sea consciente de HTTPS a través de 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 el frontend, pero ahora el /wp-admin/ es inaccesible incluso con mi cuenta de Administrador. Después de iniciar sesión recibo un mensaje: "Lo sentimos, no tienes permiso para 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 sentimos, no tienes permiso para 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 'on' 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 de functions.php no puedo acceder a wp-admin/

ACTUALIZACIÓN:

He descubierto que el mensaje de error proviene de wp-admin/menu.php y este trozo de código al final. Agregué menu.php al final del error para averiguar que era este archivo.

if ( !user_can_access_admin_page() ) {

    /**
     * Se ejecuta cuando se deniega el acceso a una página de administración.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Lo sentimos, no tienes permiso para acceder a esta página. menu.php'), 403 );
}

Todavía no entiendo cómo arreglar esto.

3
Comentarios

No mencionas mucho sobre el resto de tu configuración. ¿Configuraste define('FORCE_SSL_ADMIN', true);

user42826 user42826
23 dic 2016 23:57:06

No definí 'FORCE_SSL_ADMIN'. Lo intentaré.

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

necesitas verificar que las cookies https también se envíen desde el balanceador de carga a través de http. Parece que no se están enviando. Obviamente también hay que verificar lo contrario, si las cookies que configuras se están transfiriendo a través de https

Mark Kaplun Mark Kaplun
24 dic 2016 05:49:55
Todas las respuestas a la pregunta 1
6
28

Un agradecimiento especial al usuario42826.

De acuerdo con el codex:

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

Las siguientes acciones resolverán el problema.

Antes de require_once( ABSPATH . 'wp-settings.php' );, añade esto a wp-config.php. (referencia del codex)

/* Configuración SSL */
define('FORCE_SSL_ADMIN', true);

/* Activar HTTPS 'on' si HTTP_X_FORWARDED_PROTO coincide con 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

Elimina esto de functions.php ya que no es necesario.

/**
 * Hacer que PHP sea consciente de HTTPS a través de 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
Comentarios

La razón es que las cookies de sesión segura se pierden cuando están detrás del balanceador de carga porque el LB maneja SSL pero el backend usa http sin cifrar. ¡Qué bueno ver a otros trabajando con arquitecturas de nivel empresarial! ;)

user42826 user42826
24 dic 2016 05:02:41

@user42826 Lo bueno de esta configuración es que puedo simplemente comentar FORCE_SSL_ADMIN si quiero prohibir el acceso al administrador, ¿o hay otros efectos secundarios que debería considerar en esta línea de pensamiento?

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

En tu configuración, parece que no establecer FORCE_SSL_ADMIN impide el acceso al administrador, pero hay mejores formas de hacerlo dependiendo de tus requisitos. Ejemplos: prevenir el acceso a wp-admin o wp-login.php en .htaccess o la configuración de Apache, eliminar la autenticación nativa de WP mediante un plugin, reestructurar WP para que la URL de wp-admin sea diferente a la URL pública, etc.

user42826 user42826
25 dic 2016 20:42:58

Asegúrate de agregar este código antes de la línea require_once(ABSPATH . 'wp-settings.php');. Un agradecimiento especial a jtl en esta respuesta.

Aaroninus Aaroninus
14 sept 2017 19:02:02

@Aaroninus gracias, yo uso SSL flexible de Cloudflare y sin tu comentario habría perdido tiempo buscando de nuevo. Encontré esta pregunta relacionada anteriormente: https://wordpress.stackexchange.com/questions/170165/wordpress-wp-admin-https-redirect-loop

baptx baptx
21 dic 2017 14:33:25

Funcionó en la instancia de Amazon. Estaba teniendo problemas, al mover el código arriba funcionó.

Krishnadas PC Krishnadas PC
11 sept 2018 11:36:23
Mostrar los 1 comentarios restantes