Nginx使用WordPressredirect循环

我有一个rails应用程序和一个基于wordpress的cms在另一台服务器上。 我试图在同一个域名下托pipe他们。 我希望所有非cmsstream量redirect到https。 并且所有/ cms /stream量应该去http和代理到wordpress服务器。 但/ cms /目录无法循环。 我已经尝试了很多方法,无法解决问题。 你能找出这个nginxconfiguration上的问题吗?

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

这是最有可能的问题:

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

这只有在URI是/cms//anything才匹配。

我build议从server 80块中删除if语句并set语句,并使用如下所示的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块。