web-dev-qa-db-ja.com

nginxにHTTP POSTリライト経由でリクエストを転送させるにはどうすればよいですか?

現在、iOSアプリはhttp POST=を介してドメインAにアクセスしていますが、すべてのリクエストをドメインBに転送したいと思います。

通常のrewrite ^/(.*)$ http://mydomain/$1 permanent;を使用すると、POSTデータが失われるようです。

NginXを使用してHTTP POSTデータを別のドメインに渡すにはどうすればよいですか?

21
Jiho Kang

代わりに リバースプロキシサポート を使用してみてください。 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で実行されている2番目のサーバーに渡します。これにより、POSTが保持され、問題が発生した場合に他のリクエストタイプも保持されます。

問題は、外部リダイレクトが決してPOSTデータを再送信しないことです。これは HTTP仕様 に書き込まれます(3xxセクションを確認してください)。これを行うクライアントは仕様に違反しています。

GETまたはHEAD以外のリクエストに応答して301/302ステータスコードを受信した場合、ユーザーエージェントは、ユーザーが確認できない限り、リクエストを自動的にリダイレクトしてはなりません。これにより、リクエストが発行された条件が変わる可能性があるためです。 。

ほとんどのブラウザは、リダイレクトされたリクエストをGETリクエストにするだけでこれを実装していると確信しています。理論的には、仕様はPOSTデータをリダイレクトするかどうかをユーザーに尋ねるブラウザーを許可しますが、現在はそうすることはありません。

33