Wordpress를 사용한 Nginx 리디렉션 루프

Wordpress를 사용한 Nginx 리디렉션 루프

다른 서버에 Rails 앱과 WordPress 기반 cms가 있습니다. 동일한 도메인에서 호스팅하려고 합니다. 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문과 문을 제거하고 다음과 같은 블록을 사용하는 것이 좋습니다 .setserver 80server

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

관련 정보