【问题标题】:Rewrite response headers with node-http-proxy使用 node-http-proxy 重写响应头
【发布时间】:2012-09-27 04:15:19
【问题描述】:

我正在使用node-http-proxy 并希望查看特定响应 标题并在必要时重写它。这里的任何人都有建议 这样做?

我的代理服务器位于几个不同的节点服务器前面 以及一个java webapp。 Java 应用程序正在设置一个 cookie,但是 cookie 有一个相对于 webapp 上下文的路径。我需要 cookie 是安全的,并且在不修改 Java 的情况下具有 root 路径 应用。

换句话说,返回以下标头:

set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/app; HttpOnly

我想将 Path 值重写为:

set-cookie: MYSPECIALCOOKIE=679b6291-d1cc-47be; Path=/; HttpOnly; Secure

我不清楚如何使用 node-http-proxy 来做到这一点。建议? 有没有中间件可以帮助解决这个问题?

【问题讨论】:

  • 如果其他人遇到这个问题,gzip 连接中间件使用的模式可能能够解决我的问题。我已经破解了基于 gzip 实现的自己的中间件,但还没有花时间让它完全工作。但是,看起来它可以进行更多调整。查看github.com/nodejitsu/node-http-proxy/blob/master/examples/…

标签: node.js node-http-proxy


【解决方案1】:

只需听proxyRes 事件并输入您的逻辑即可。

proxy.on('proxyRes', (proxyRes, req, res) => {
    // modifying headers goes here
});

https://www.npmjs.com/package/http-proxy#listening-for-proxy-events

【讨论】:

    【解决方案2】:

    您可以通过重载响应对象的 writeHead 函数来实现这一点。例如,此代码会将“foo”响应标头设置为值“bar”。我已经指出您可以在哪里添加自己的逻辑来更改标题值。

    JavaScript 不是我的主要语言,因此可能有一种更惯用的方式来重载 writeHead 方法。

    httpProxy = require('http-proxy');
    
    httpProxy.createServer(function (req, res, proxy) {
    
      res.oldWriteHead = res.writeHead;
      res.writeHead = function(statusCode, headers) {
        /* add logic to change headers here */
        var contentType = res.getHeader('content-type');
        res.setHeader('content-type', 'text/plain');
    
        // old way: might not work now
        // as headers param is not always provided
        // https://github.com/nodejitsu/node-http-proxy/pull/260/files
        // headers['foo'] = 'bar';       
    
        res.oldWriteHead(statusCode, headers);
      }
    
      proxy.proxyRequest(req, res, {
        host: 'localhost',
        port: 3000
      });
    }).listen(8000);
    

    【讨论】:

    • 谢谢!这个答案与我最终做的基本相同。只是忘了回到这里并添加答案。我通过检查这段代码找到了一个如何做到这一点的例子:github.com/nateps/connect-gzip/blob/master/lib/gzip.js
    • 很好的答案!请记住,对于某些标头,如果存在多个标头实例,getHeader 将返回一个数组。 setHeader 也接受一个数组。很容易被绊倒。这不应该出现在内容类型上。
    【解决方案3】:

    我没有测试此代码,但它应该允许您在发送请求之前编辑您的标头。让我知道它是否有效。

    var httpProxy = require('http-proxy');
    
    var server = httpProxy.createServer(function (req, res, proxy) {
      var buffer = httpProxy.buffer(req);
      req.headers['x-host'] = process.env.PROXY_URI;
      proxy.proxyRequest(req, res, {
        host: '127.0.0.1',
        port: 9000,
      });
    });
    

    【讨论】:

    • 您的代码正在为请求设置标头。我需要更改 response 上的标题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多