我需要在第三方服务上解决CORS,所以我想构建一个代理来添加标题“Access-Control-Allow-Origin:*”。
为什么这段代码没有添加标题?
httpProxy = require('http-proxy');
var URL = 'https://third_party_server...';
httpProxy.createServer({ secure: false, target: URL }, function (req, res, proxy) {
res.oldWriteHead = res.writeHead;
res.writeHead = function(statusCode, headers) {
/* add logic to change headers here */
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
res.oldWriteHead(statusCode, headers);
}
proxy.proxyRequest(req, res, { secure: false, target: URL });
}).listen(8000);
答案 0 :(得分:14)
您有proxyRes
个活动。
所以这样的事情应该有效:
proxy.on('proxyRes', function(proxyRes, req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
});
完整的工作示例(好吧,当我说完整时,我并不是说这是一个安全 - 故障安全 - 真实的代理,但它可以解决您的问题):
var http = require('http'),
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
var server = http.createServer(function(req, res) {
proxy.web(req, res, {
target: 'https://third_party_server...',
secure: false,
ws: false,
prependPath: false,
ignorePath: false,
});
});
console.log("listening on port 8000")
server.listen(8000);
// Listen for the `error` event on `proxy`.
// as we will generate a big bunch of errors
proxy.on('error', function (err, req, res) {
console.log(err)
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end("Oops");
});
proxy.on('proxyRes', function(proxyRes, req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
});
答案 1 :(得分:1)
对于将来遇到此问题的人,这里有一个更新的答案。结合 Michael Gummelt 的评论和 Nicholas Mitrousis 的回答,如果 res
中上游的响应具有相同的标头集,则在 proxyRes
上设置的任何标头都将被覆盖。所以要回答原来的问题:
proxy.on('proxyRes', function(proxyRes, req, res) {
proxyRes.headers["access-control-allow-origin"] = "*";
proxyRes.headers["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS";
}
答案 2 :(得分:0)
尽管这个问题很老,但它是 Google 的第一个结果,当前的答案并不是非常有用。
首先要注意的是 proxyRes
没有 setHeader()
方法。此外,如果您尝试使用 proxyRes
覆盖 res.setHeader('Header-to-Override', 'new value')
标头,它将不起作用(我假设是因为在此事件发生后标头从 proxyRes
复制到 res
被解雇了。
看来我们不是唯一遇到此问题的人:https://github.com/http-party/node-http-proxy/issues/1401
这是我在我的情况下添加额外的 cache-control
标头的解决方案:
proxy.on('proxyRes', function(proxyRes, req, res) {
if (proxyRes.headers['cache-control']) {
proxyRes.headers['cache-control'] += ', proxy-revalidate'
} else {
proxyRes.headers['cache-control'] = 'proxy-revalidate'
}
})