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]

Problemas con los permalinks

Cuando migramos un WordPress instalado en un servdor con apache desde una IP pública a una privada y servimos las páginas a través del proxy de nginx normalmente hemos de configurar el apache para que deje de servir la web mediante SSL y lo haga por el puerto 80.

Durante esta configuración se nos puede olvidad incluir las directivas necesarias para que en el directorio de WordPress el apache atienda al contenido del fichero .htaccess, ya que estas directivas podrían estar en la configuración del servidor SSL. En ese caso el sistema daría un error del tipo 404 cuando empleamos permalinks. Para evitarlo, habría que incluir las siguientes líneas en el archivo de configuración de apache:

<Directory /var/www/wordpress>
    Options +FollowSymLinks
    AllowOverride All
    order allow,deny
    allow from all
</Directory>