
다른 서버에 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
문과 문을 제거하고 다음과 같은 블록을 사용하는 것이 좋습니다 .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