首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在node-http-proxy响应中添加报头

如何在node-http-proxy响应中添加报头
EN

Stack Overflow用户
提问于 2016-01-09 02:56:16
回答 3查看 11.3K关注 0票数 11

我需要在第三方服务上解决CORS,所以我想构建一个代理来添加头部"Access-Control-Allow-Origin:*“。

为什么这段代码没有添加头部?

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

发布于 2016-01-11 00:48:02

您有可用的proxyRes事件。

所以像这样的东西应该是可行的:

代码语言:javascript
复制
proxy.on('proxyRes', function(proxyRes, req, res) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
});

完整的工作示例(嗯,当我说完整的时候,我并不是说这是一个安全的-故障安全的-真实的代理,但它可以解决你的问题):

代码语言:javascript
复制
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');
});
票数 17
EN

Stack Overflow用户

发布于 2021-07-01 21:38:51

对于那些在未来遇到这个问题的人,这里有一个更新的答案。结合Michael Gummelt的评论和Nicholas Mitrousis的回答,如果来自proxyRes上游的响应具有相同的标头集,则res上设置的任何标头都将被覆盖。因此,回答最初的问题:

代码语言:javascript
复制
proxy.on('proxyRes', function(proxyRes, req, res) {
 proxyRes.headers["access-control-allow-origin"] = "*";
 proxyRes.headers["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS";
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-24 07:33:38

尽管这个问题很老,但它是谷歌的第一个结果,目前的答案并不是很有信息量。

第一点需要注意的是,proxyRes没有setHeader()方法。此外,如果您尝试使用res.setHeader('Header-to-Override', 'new value')覆盖proxyRes标头,它将不起作用(我假设这是因为在触发此事件之后,标头被从proxyRes复制到res

似乎我们不是唯一有这个问题的人:https://github.com/http-party/node-http-proxy/issues/1401

以下是我的解决方案,用于在我的情况下添加额外的cache-control标头:

代码语言:javascript
复制
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'
  }
})

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34684139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档