Loop de redirecionamento Nginx com Wordpress

Loop de redirecionamento Nginx com Wordpress

Eu tenho um aplicativo Rails e um cms baseado em wordpress em outro servidor. Estou tentando hospedá-los no mesmo domínio. Quero que todo o tráfego que não seja cms seja redirecionado para https. E todo o tráfego /cms/ deve ir para http e proxy para o servidor wordpress. Mas o diretório /cms/ falha em um loop infinito. Tentei muitas alternativas e não consegui resolver o problema. Você pode identificar o problema nesta configuração do 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;
    }
}

Responder1

Este é provavelmente o problema:

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

Isso corresponde apenas quando o URI é semelhante a /cms//anything.

Eu sugeriria remover as ifinstruções e setinstruções do server 80bloco e usar um serverbloco 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;
    }
}

Removi os outros locationblocos, pois são irrelevantes para o server 80bloco de acordo com seus desejos.

informação relacionada