2013-10-24 4 views
9

/api에있는 모든 요청을 백엔드 Tomcat REST 서비스에 전달하도록 nginx proxy_pass 설정을했습니다. 이 서비스는 경우에 따라 요청 유형에 따라 달라지는 Location 헤더를 반환합니다 (예 : Location: http://foo.bar/baz/api/search/1234567). baz 부분은 Tomcat에서 호스팅되기 때문입니다.nginx proxy_pass를 사용하여 위치 헤더 수정

현재 구성에서는 foo.bar 호스트 이름을 올바르게 다시 작성하지만 baz 부분은 그대로 둡니다. 이것을 벗겨 내고 싶지만 proxy_pass 옵션은 헤더를 지우거나 새 값을 설정하는 것으로 제한됩니다.

클라이언트에 전달되기 전에 헤더를 동적으로 수정하는 방법이 있습니까? 예를 들어 정규 표현식을 사용 하시겠습니까? 이것은 내 nginx를 구성입니다 :

location /api { 
    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_max_temp_file_size 0; 
    client_max_body_size 10m; 
    client_body_buffer_size 128k; 
    proxy_connect_timeout 90; 
    proxy_send_timeout  90; 
    proxy_read_timeout  90; 
    proxy_buffers   32 4k; 
    proxy_redirect off; 

    proxy_pass http://foo.bar:8080/baz/api; 
} 

답변

11

당신은 그것을 수정하는 정규 표현식을 사용할 수 있습니다하지만 더 좋은 방법은 프록시 리디렉션 사용하는 것입니다

proxy_redirect http://foo.bar/baz/ /; 

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

모든 위치 헤더를 foo.bar/baz//

으로 바꿀 것입니다. /baz/api을 리디렉션하려는 경우에도 작동합니다.

리디렉션에서 포트를 추가하는 경우 http://foo.bar:8080/baz/도 추가해야합니다 (별도 리디렉션).

희망이 도움이됩니다.

+1

답장을 보내 주셔서 감사합니다.하지만 리디렉션에 관심이 많지는 않지만 서버 응답으로 반환되는 Location 헤더를 수정해야합니다. API는 클라이언트가 이전 쿼리의 결과를 가져 오는 것으로 가정되는 URL을 포함하는'Location' 헤더를 반환합니다. 이것은 서버가 프록시되는 것을 모르기 때문에 잘못된 위치를 가리키고 있습니다. – user2010963

+1

proxy_redirect가 Location 헤더를 수정합니다 ... 목적입니다. nginx 문서 (http://wiki.nginx.org/HttpProxyModule#proxy_redirect)를보세요 :) –

+1

아, 알겠습니다! 그것은 실제로 그것을했습니다. 고맙습니다! (나는 '리디렉션'이 실제로 무엇을위한 최선의 이름이 아니라고 생각하지만) – user2010963