다시 쓰기를 통해 nginx가 HTTP POST 요청을 전달하도록하려면 어떻게해야합니까?


19

내 iOS 앱이 현재 http POST를 통해 도메인 A에 액세스하고 있지만 모든 요청을 도메인 B로 전달하고 싶습니다.

평소 rewrite ^/(.*)$ http://mydomain/$1 permanent;에 POST 데이터를 사용하면 손실되는 것 같습니다.

NginX를 사용하여 HTTP POST 데이터를 다른 도메인으로 전달하려면 어떻게해야합니까?

답변:


32

대신 리버스 프록시 지원을 사용해보십시오 . 예제 location섹션은 다음과 같습니다.

location / {
  proxy_pass      http://localhost:8080;
  proxy_redirect  http://localhost:8080/ /;
  proxy_read_timeout 60s;

  # May not need or want to set Host. Should default to the above hostname.
  proxy_set_header          Host            $host;
  proxy_set_header          X-Real-IP       $remote_addr;
  proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
}

이 예제는 모든 요청을이 server블록에 대해 실행중인 두 번째 서버로 전달합니다 localhost:8080. 이것은를 POST유지하고 다른 요청 유형도 문제가되면 유지해야합니다.

문제는 외부 리디렉션이 데이터를 다시 보내지 않는다는 것 POST입니다. 이것은 HTTP 스펙에 기록됩니다 (3xx 섹션을 확인하십시오). 이 작업을 수행하는 모든 클라이언트가 사양을 위반하고 있습니다.

GET 또는 HEAD 이외의 요청에 대한 응답으로 301/302 상태 코드가 수신되면, 사용자 에이전트는 요청이 발행 된 조건을 변경할 수 있으므로 사용자가 확인할 수없는 경우 요청을 자동으로 리디렉션해서는 안됩니다 (MUST NOT). .

나는 대부분의 브라우저가 단순히 리디렉션 된 요청을 요청으로 강제하여 이것을 구현한다고 확신합니다 GET. 이론적 으로이 사양은 사용자에게 POST데이터 리디렉션 여부를 묻는 브라우저를 허용 하지만 현재 수행중인 것을 알지 못합니다.


대박! 매력처럼 작동
— 강지호

주석과 약간 혼동됩니다. 일반적으로 proxy_set_header값 을 설정하고 싶 습니까? 그렇지 않으면 원격 주소가 프록시 서버의 원격 주소가된다고 생각하지만 일반적으로 원하는 것은 클라이언트의 원격 주소입니다. 맞습니까?
— Georgios Pligoropoulos

나를 구한 답변에 감사드립니다! nginx를 설정하여 포스트 요청을 uwsgi로 올바르게 다시 전달하지만 http 모드에서 uwsgi를 실행하는 대신 소켓을 사용하는 방법이 있습니까?
— Greg Jennings

@GregJennings 응답에 약간 늦었지만 'proxy_pass'대신 'uwsgi_pass'지시문을 사용합니다. 누군가 다른 사람을보고 방황하는 경우를 대비해 ..
— Kamilion

1
@Will proxy_redirect은 두 가지 주장을 취합니다. 다음 문서를 참조하십시오 : nginx.org/en/docs/http/…
— Matthew Scharley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.