Configurar $_SERVER['HTTPS']='on' impide el acceso a wp-admin
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.
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';
}

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

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.

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