다시 쓰기를 통해 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.