Configurar WordPress con nginx como proxy inverso

Hemos empezado a colocar determinadas instalaciones de WordPress detrás de un proxy reverso por varios motivos. El primero es que las instalaciones antiguas de los containers lxc no actualizan a la última versión de certbot y no es posible actualizar automáticamente los certificados SSL. Otro motivo es que algunos de estos containers están basados en una versión antigua de debian que ya no se actualiza y al ponerlos detrás del proxy nos aseguramos de que solamente exponen el puerto 443/80 al exterior. La posibilidad de moverlos desde un proxmox a otro sin tener que realizar ajustes en el container es otro motivo de peso.

No vamos a comentar aquí como instalar un servidor web detrás de un proxy reverso empleando nginx ni de como generar los certificados SSL correspondientes empleando certbot.

Lo que si vamos a explicar es la solución a un problema muy frecuente que ocurre al colocar una instalación de WordPress detrás de un proxy reverso: los bucles de redirecciones infinitas o redirect loop – too many redirects que nos muestra el navegador cuando ya está todo configurado.

La solución consiste en modificar el archivo wp-config.php para que quede de la siguiente forma:

define('FORCE_SSL_ADMIN', true); 

define('WP_HOME','https://example.org');
define('WP_SITEURL','https://example.org');

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

Tres cosas a tener en cuenta:

La primera es que en las definiciones de WP_HOME y SP_SITEURL hay que poner la URL del sitio web. No vale emplear las variables de servidor que el WordPress instala (o instalaba en versiones antiguas) por defecto:

define('WP_HOME', 'https://'.$_SERVER['HTTP_HOST']);
define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST']);

La segunda cosa es incluir la sentencia:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

Esta sentencia permitirá que la web cargue el tema y las imágenes, que de otro modo no aparecerían y la página contendría solamente texto mal formateado

La tercera cosa es comentar los redireccionamientos hacia https del archivo .htaccess de wordpress. Habría que comentar las siguiente líneas en el .httaccess:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]