我需要将node.js服务器的所有POST请求重定向到远程服务器。
我尝试了以下操作:
app.post('^*$', function(req, res) {
res.redirect('http://remoteserver.com' + req.path);
});
重定向有效,但没有POST参数。我应该修改什么来保留POST参数?
答案 0 :(得分:52)
在HTTP 1.1中,有一个状态代码(307),表示应该使用相同的方法重复请求并发布数据。
307临时重定向(自HTTP / 1.1起)在这种情况下,请求应该使用另一个URI重复,但将来的请求仍然可以使用原始URI。与303相反,在重新发出原始请求时不应更改请求方法。例如,必须使用另一个POST请求重复POST请求。
在express.js中,状态代码是第一个参数:
res.redirect(307, 'http://remoteserver.com' + req.path);
在programmers 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