Цикл перенаправления Nginx с Wordpress

Цикл перенаправления Nginx с Wordpress

У меня есть приложение rails и cms на основе wordpress на другом сервере. Я пытаюсь разместить их на одном домене. Я хочу, чтобы весь трафик, не относящийся к cms, перенаправлялся на https. А весь трафик /cms/ должен идти на http и прокси на сервер wordpress. Но каталог /cms/ выходит из строя и переходит в бесконечный цикл. Я перепробовал много альтернатив, но не смог решить проблему. Можете ли вы определить проблему в этой конфигурации nginx, пожалуйста?

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;
    }
}

решение1

Вероятнее всего, проблема в следующем:

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

Соответствует только тогда, когда URI имеет вид /cms//anything.

Я бы предложил удалить ifутверждения и setвысказывания из server 80блока и использовать serverтакой блок:

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;
    }
}

Я удалил остальные locationблоки, так как они не имеют отношения к server 80блоку, согласно вашим пожеланиям.

Связанный контент