Redirección constante de Wordpress con nginx upstream

4

Ha surgido una situación en la que server1, ejecutando Nginx, reenviará todas las ubicaciones "/" a server2, mientras mantiene "/ api" y algunas otras en server1. Esto también intenta que SSL siga funcionando. Intentar mover la URL de WP de http://test.example.com a https://example.com hace que la página principal se cargue correctamente, pero la carga wp-adminda demasiados redireccionamientos.

Servidor1 Nginx:

upstream webapp_url {
    server IP:80;
}

server {
        listen 443 ssl;
        server_name www.example.com example.com;
        access_log /var/log/nginx/example.log;

        ssl_certificate /etc/nginx/ssl/example.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
        ssl_ciphers RC4:HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location /files/ {
                root /home;
                access_log off;
                expires max;
                if ($request_filename !~* ^.*?\.(jpg)|(png)|(gif)|(pdf)){
                        add_header Content-Disposition: "$request_filename";
                }
        }

        location / {
                # proxy_pass http://site_url/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header X-Forwarded-Proto https;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Example "1";
                proxy_pass http://webapp_url/;
        }

Esto carga bien el otro servidor, la página de inicio y los enlaces funcionan (aunque hay advertencias de contenido mixto porque no puedo cambiarlo en el administrador). WP siteurly homeambos están configurados con la nueva dirección.

Server2 Nginx:

server {
    #listen       443 ssl;
    listen 80;
    server_name example.com test.example.com;
    client_max_body_size 30M;
    error_log /var/log/wordpress/error.log info;
    location / {
        root   /home/wordpress;
        try_files $uri $uri/ /index.php?q=$request_uri;
        index index.php  index.html index.htm;
    }

    #ssl_certificate /etc/nginx/ssl/example.crt;
    #ssl_certificate_key /etc/nginx/ssl/example.key;
    #ssl_ciphers RC4:HIGH:!aNULL:!MD5;
    #ssl_prefer_server_ciphers on;

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    #
    location ~ \.php$ {
        root           /home/wordpress;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

La carga /wp-admin/inicia una redirección infinita (a la misma URL). También lo he definido en wp-config.php:

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

wp-admincomprueba si la conexión es segura; de lo contrario, redirige a la httpsversión de la misma URL. En una situación como la suya, esto provoca un bucle de redireccionamiento.

Debe decirle a WordPress que la conexión es segura.

Observo que configura el encabezado apropiado en el servidor 1 con:

proxy_set_header X-Forwarded-Proto $scheme;

(En su caso, el valor de $schemeestá cableado a https).

Sin embargo, también debe pasar esto a WordPress, en forma de HTTPSparámetro, con un valor de on.

Esto se logra con una mapdirectiva (en el servidor 2):

map $http_x_forwarded_proto $https_flag {
    default off;
    https on;
}
server {
    ...
}

(La mapdirectiva se coloca dentro del httpbloque. Puede colocarla justo encima del serverbloque como se muestra arriba. Consulte este documento para obtener más detalles)

Además, agregue otro fastcgi_parampara pasar el HTTPSparámetro a WordPress (en el servidor 2):

location ~ \.php$ {
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS $https_flag;
    ...
}