Bucle de redireccionamiento de Nginx con Wordpress

Bucle de redireccionamiento de Nginx con Wordpress

Tengo una aplicación Rails y un cms basado en WordPress en otro servidor. Estoy intentando alojarlos en el mismo dominio. Quiero que todo el tráfico que no sea cms se redirija a https. Y todo el tráfico /cms/ debe ir a http y proxy al servidor wordpress. Pero el directorio /cms/ falla en un bucle sin fin. Probé muchas alternativas y no pude resolver el problema. ¿Puede identificar el problema en esta configuración de nginx, por favor?

upstream example {
   server unix:/tmp/unicorn.example.sock fail_timeout=0;
 }

 server {
   listen 80;
   server_name www.example.com example.com;
   root /home/deployer/apps/example/current/public;

   set $redirect true;
   if ($request_uri ~ ^/cms/(/.*)$) {
     set $redirect false;
   }

   location /cms/ {
            proxy_pass  http://cms.example.com:80/;
            proxy_set_header Host cms.example.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect    off;
   }

   if ($redirect = true) {
      rewrite ^ https://www.example.com$request_uri? permanent;
   }

   location ^~ /assets/ {
     gzip_static on;
     expires max;
     add_header Cache-Control public;
   }

   try_files $uri/index.html $uri @example;
   location @example {
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     proxy_pass http://example;
   }

   error_page 500 502 504 /500.html;
   client_max_body_size 4G;
   keepalive_timeout 10;

   if (-f $document_root/system/maintenance.html) {
     return 503;
   }

   error_page 503 @maintenance;
   location @maintenance {
     rewrite  ^(.*)$  /system/maintenance.html last;
     break;
   }

}

server {
    listen 443;
    server_name www.example.com example.com;
    root /home/deployer/apps/example/current/public;

    ssl on;
    ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;
    ssl_session_cache shared:SSL:10m;
    ssl_prefer_server_ciphers on;
    ssl_certificate /home/deployer/certs/server.crt;
    ssl_certificate_key /home/deployer/certs/server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    error_log /home/deployer/apps/example/current/log/nginx_error.log;

    location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    location /cms/ {
        rewrite ^ http://www.example.com$request_uri? permanent;
    }

    try_files $uri/index.html $uri @example;
    location @example {
        proxy_set_header  X_FORWARDED_PROTO https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://example;
    }
    error_page 500 502 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;

    if (-f $document_root/system/maintenance.html) {
      return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
      rewrite  ^(.*)$  /system/maintenance.html last;
      break;
    }
}

Respuesta1

Lo más probable es que este sea el problema:

if ($request_uri ~ ^/cms/(/.*)$) {
    set $redirect false;
}

Esto coincide sólo cuando el URI es como /cms//anything.

Sugeriría eliminar las ifdeclaraciones y setdeclaraciones del server 80bloque y usar un serverbloque como este:

server {
    listen 80;
    server_name www.example.com example.com;
    root /home/deployer/apps/example/current/public;

    location / {
        rewrite ^ https://www.example.com$request_uri? permanent;
    }

    location /cms {
        proxy_pass  http://cms.example.com:80/;
        proxy_set_header Host cms.example.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect    off;
    }
}

Eliminé los otros locationbloques, ya que son irrelevantes para el server 80bloque según tus deseos.

información relacionada