30

node.js サーバーのすべての POST 要求をリモート サーバーにリダイレクトする必要があります。

私は次のことを試しました:

app.post('^*$', function(req, res) {
  res.redirect('http://remoteserver.com' + req.path);
});

リダイレクトは機能しますが、POST パラメーターがありません。POST パラメータを保持するには何を変更すればよいですか?

4

1 に答える 1

60

HTTP 1.1 には、同じメソッドを使用してリクエストを繰り返し、データを送信する必要があることを示すステータス コード (307) があります。

307 一時リダイレクト (HTTP/1.1 以降) この場合、別の URI でリクエストを繰り返す必要がありますが、今後のリクエストでは元の URI を引き続き使用できます。303 とは対照的に、元のリクエストを再発行するときにリクエスト メソッドを変更しないでください。たとえば、別の POST 要求を使用して POST 要求を繰り返す必要があります。

Express.js では、ステータス コードは最初のパラメーターです。

res.redirect(307, 'http://remoteserver.com' + req.path);

詳細については、プログラマーの stackexchangeを参照してください。

プロキシ

それが機能しない場合は、ユーザーに代わってサーバーから別のサーバーに POST 要求を行うこともできます。ただし、リクエストを行うのはユーザーではなくサーバーであることに注意してください。本質的には、リクエストをプロキシします。

var request = require('request'); // npm install request

app.post('^*$', function(req, res) {
    request({ url: 'http://remoteserver.com' + req.path, headers: req.headers, body: req.body }, function(err, remoteResponse, remoteBody) {
        if (err) { return res.status(500).end('Error'); }
        res.writeHead(...); // copy all headers from remoteResponse
        res.end(remoteBody);
    });
});

通常のリダイレクト:

user -> server: GET /
server -> user: Location: http://remote/
user -> remote: GET /
remote -> user: 200 OK

「リダイレクト」を投稿:

user -> server: POST /
server -> remote: POST /
remote -> server: 200 OK
server -> user: 200 OK
于 2013-07-12T10:33:47.327 に答える