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 回答