2013-05-10 1 views
1

기존 레거시 시스템과 Rails 기반의 새로운 애플리케이션 사이에서 프록시를 사용하는 nginx를 사용하여 역 프록시를 생성합니다. 특정 URL과 일치하지 않거나 요청 본문에 특정 매개 변수가없는 경우를 제외하고 기본적으로 모든 트래픽을 Rails 사이트에 보냅니다. 그러나 URL이 기존 조건과 일치하는 경우가 있지만 특정 매개 변수가있는 경우 새 시스템으로 리디렉션해야합니다. 예를 들어, 우리는 URL이 /index.cfm?fuseaction=search인데, 이는 보통 레거시 시스템으로 보내지 만, fuseaction=search이 포함되어 있으므로 /search/events으로 새 시스템으로 리디렉션해야합니다. 다음 구성을 작성했습니다. 내가 nginx를 시작하려고 할 때Nginx 역방향 프록시에서 URI로

upstream legacy { 
    server 10.0.0.1:80; 
} 

upstream rails { 
server 10.0.0.2:80; 
} 

server { 
    listen  0.0.0.0:80; 
    server_name mydomain.com 
    root /usr/share/nginx/html; 
    index index.html index.htm; 

    location/{ 

     proxy_pass http://rails; 
     if ($request_body ~* fuseaction(?!=public\.search(_all(_by_type)?)?)) 
      { 
        proxy_pass http://legacy; 
      } 

     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
     proxy_redirect off; 
     proxy_buffering off; 
     proxy_set_header  Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 


    location ~* /(index.cfm|images|uploads|admin|htmlArea|innovastudio|js|scripts|w3c)*$ { 
     proxy_pass http://legacy; 

     if ($request_body ~* fuseaction=public\.search(_all(_by_type)?)?) 
      { 
        proxy_pass http://rails/search/events; 
      } 

     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
     proxy_redirect off; 
     proxy_buffering off; 
     proxy_set_header  Host   $host; 
     proxy_set_header  X-Real-IP  $remote_addr; 
     proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 
} 

그러나, 나는 다음과 같은 오류 얻을 :

"proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /etc/nginx/sites-enabled/default:56 

내가 오류가 무슨 말을 이해를하지만, 나는 그것을 해결하는 방법을 잘 모르겠습니다. 어쩌면 proxy_pass은 내가 필요로하는 것이 아닐까요? 어쩌면 proxy_redirect을 사용해야합니까? 이 문제를 해결할 수있는 방법에 대한 도움을 주시면 감사하겠습니다.

답변

1

, 나는 내가 실제로 필요한 것을 대신 프록시에 노력하는 리디렉션 할 것을 깨달았다. 결국 변경된 많은 것들 외에도 $request_body 대신 $args 변수를 검사했습니다. 다음은 재 작성 블록 내가이 재 작성에서 모든 쿼리 매개 변수를 제거 ? 후행,

if ($args ~ fuseaction\=public\.race_search(_all(_by_type)?)?) 
{ 
    rewrite ^(.*)$ /search/events? permanent; 
} 

if ($args ~ fuseaction\=public\.tools) 
{ 
    rewrite ^(.*)$ /directors? permanent; 
} 

if ($args ~ fuseaction\=public\.contact) 
{ 
    rewrite ^(.*)$ /contact? permanent; 
} 

if ($args ~ fuseaction\=public\.spotlight) 
{ 
    rewrite ^(.*)$ /search/events? permanent; 
} 

if ($args ~ fuseaction\=public\.results) 
{ 
    rewrite ^(.*)$ /search/results? permanent; 
} 

첫 번째 인수가 재 작성하는 것을 전체 경로, 두 번째는 그것을 알려줍니다 일치 완료 될 때 모습, 그리고 무엇 세 번째는 301 (영구) 리디렉션을 수행합니다.

1

proxy_pass는 괜찮을 것이지만 왜 그 행에 대해 불평하는지 모르겠다. "// 레일스"는 분명히 접근 가능한 URI인가?

나는 $ request_body를 사용하는 것과 관련된 것으로 생각했을 것이다. 일치해야하는 GET 매개 변수가 있다는 것을 알고 있다면 $ args를 사용하는 것으로 전환 할 것이다. 같은

뭔가이 문제를 이해하려고 노력하는 과정에서

 if ($args ~ "fuseaction(?!=public\.search(_all(_by_type)?)?)") 
+0

답변 해 주셔서 감사합니다. 나는 이미 그것을 알아 냈다. 그러나 나는 나의 자신의 질문에 여기에서 대답하는 것을 잊었다. 대답은 재 지정을 사용하여 리디렉션을 수행하는 것이 었습니다. –

+0

오, 예, 답 중 일부가 정확합니다. 나는'args'로 전환해야했다. 내가 말할 수있는 것에서'request_body'는 항상 비어 있거나 null이었습니다. –

+1

나의 기쁨, 예, 쓸데없는 점, 나는 그것을 놓쳤다. $ request_body는 게시물이 아니면 다량을 포함하지 않을 것입니다. 다행 이군요. Rgds .... Hoonto/Matt – hoonto