書き換えによってHTTP POSTリクエストを転送するには、nginxを取得するにはどうすればよいですか?


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ブロックへのすべてのリクエストを、で実行されている2番目のサーバーに渡しますlocalhost:8080。これはを保持しPOST、問題になる場合は他のリクエストタイプも保持する必要があります。

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

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

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


すごい!チャームのように動作します
ジホカン

コメントから少し混乱しています。通常、proxy_set_header値を設定しますか?それ以外の場合、リモートアドレスはプロキシサーバーのリモートアドレスになると思いますが、通常はクライアントのリモートアドレスが必要です。
ゲオルギオスプリゴロプロス14年

私を救った答えをありがとう!httpモードでuwsgiを実行する代わりにソケットを使用して、post要求をuwsgiに正しく返すようにnginxをセットアップする方法はありますか?
グレッグジェニングス

@GregJennings返信に少し遅れましたが、「proxy_pass」の代わりに「uwsgi_pass」ディレクティブを使用します。他の誰かが探してさまよう場合に備えて...
カミリオン

1
@Will proxy_redirectは2つの引数を取ります。:ドキュメントを参照してくださいnginx.org/en/docs/http/...
マシューScharley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.