标签: node-http-proxy

如何使用 node-http-proxy 抑制来自目标的 301 重定向?

当代理的目标发出重定向(在本例中为 301)时,代理会将其转发给客户端。然后客户端被重定向到实际域并且不再使用代理。有没有办法防止这种重定向影响客户端?我希望代理遵循重定向,但我不希望客户端在遵循此重定向时离开代理。

示例案例:

假设我在fake-proxy.example. 将目标设置为服务器 ip,然后将主机设置为该服务器上的域时,代理会尝试通过http. 该域设置为将http流量重定向到https并发出 301 重定向到与https. 这个重定向被发送回客户端,客户端离开fake-proxy.example并进入实际域(为了这个问题,我们称之为real-domain.example)。我的配置:

var options = {
    target: {
        host: '1.1.1.1'
    },
    headers: {
        host: 'real-domain.example'
    },
    autoRewrite: false,
    hostRewrite: false,
    protocalRewrite: false
};
Run Code Online (Sandbox Code Playgroud)

我感谢您的帮助!

javascript proxy redirect node.js node-http-proxy

6
推荐指数
1
解决办法
1200
查看次数

让 Node-http-proxy 与 socket.io 一起工作?

我正在尝试使用node-http-proxy将流量定向到端口3000(我的rails服务器)和端口8888(我的nodejs socket.io服务器)。我使用 node-http-proxy 充当端口 80 上的反向代理。

(我几乎只是从 node-http-proxy 复制自述文件)

var proxy = new httpProxy.HttpProxy({ 
  target: { 
    host: 'localhost', 
    port: CONFIG.RAILS_PORT,
  }
});

var server = http.createServer(function(req, res) { 
  //
  // Proxy normal HTTP requests
  //
  proxy.proxyRequest(req, res);
});

server.on('upgrade', function(req, socket, head) { 
  // 
  // Proxy websocket request to another port 
  //
  console.log('inside upgrade');
  proxy.proxyWebSocketRequest(req, socket, head, {
    host: 'localhost', 
    port: CONFIG.NODEJS_PORT
  });
});

server.listen(80);

var WrappedServer = require('./wrappedServer').WrappedServer
var singleton = new WrappedServer();
singleton.run(CONFIG.NODEJS_PORT, {'log level': 2});
Run Code Online (Sandbox Code Playgroud)

这是我在浏览器上的 client.js。 …

node.js socket.io node-http-proxy

5
推荐指数
1
解决办法
3665
查看次数

如何使用 node-http-proxy 启用 HSTS?

在 node.js 0.8 下,我在“路由器表”模式下使用 node-http-proxy,配置如下:

var httpProxy = require("http-proxy");
var config = require("./config");

proxyServer = httpProxy.createServer({
    hostnameOnly: true,
    router: {
        "one.example.com": "localhost:9000",
        "two.example.com": "localhost:9001"
    },
    https: {
        key: config.key,
        cert: config.cert,
        // mitigate BEAST: https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls
        honorCipherOrder: true,
        ciphers: "ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH"
    }
})
proxyServer.listen(8000)
Run Code Online (Sandbox Code Playgroud)

我想添加HSTS(HTTP 严格传输安全),以便兼容的浏览器被告知始终使用 SSL。为此,我需要让 http-proxy 添加标头:

Strict-Transport-Security: max-age=60000
Run Code Online (Sandbox Code Playgroud)

(或其他最大年龄)。我怎样才能让 node-http-proxy 有效地附加这个标头?

https node.js node-http-proxy

5
推荐指数
1
解决办法
4507
查看次数

node.js http-proxy如何根据请求设置超时和处理程序

我在node.js上使用http-proxy.我有一个代理请求到另一台服务器.我的要求是代理请求应该在10秒内超时.此外,当超时发生时,我应该能够向用户显示自定义消息

我有以下代码

var proxy = new httpProxy.RoutingProxy();
  req.on('error', function (err,req,res){
       res.send("An error occured");
  });
  proxy.proxyRequest(req, res, {
    host: 'localhost',
    port: port,
    headers:req.headers,
    timeout:10000
  })  
Run Code Online (Sandbox Code Playgroud)

这设置超时(由于原因未知,它在17秒内超时)但回调从未执行.它只显示标准浏览器消息

The connection was reset
          The connection to the server was reset while the page was loading.
Run Code Online (Sandbox Code Playgroud)

提前致谢

更新:

我试过了

proxy.on('proxyError', function (err,preq,pres) {
    pres.writeHead(500, { 'Content-Type': 'text/plain' });
    pres.write("An error happened at server. Please contact your administrator.");
    pres.end();
  });
Run Code Online (Sandbox Code Playgroud)

这次调用该方法,但它抱怨已经发送了响应,因此无法设置标头

node.js node-http-proxy

5
推荐指数
1
解决办法
2923
查看次数

在同一个域上托管两个 Node.JS 应用程序

我有两个节点 js 应用程序在同一个盒子上运行,我希望它为所有路由运行第一个节点 js 应用程序,除非 url 是 www.domain.com/blog 以转到另一个节点 js 应用程序。使用此设置甚至可以做到这一点,还是我必须设置子域并使用 nginx 或其他东西?

node.js node-http-proxy

5
推荐指数
0
解决办法
2434
查看次数

使用node-http-proxy代理websocket时如何修改消息

ATT。

我用来node-http-proxy代理 websocket,

但如何在发送到后端 websocket 服务器之前修改消息?

websocket node.js express node-http-proxy

5
推荐指数
0
解决办法
168
查看次数

Node http-proxy / http-proxy-middleware - 如何操作代理响应

我正在使用 Express 4,并且正在使用中间件http-proxy-middlewarehttps://github.com/chimurai/http-proxy-middleware),并且遇到以下问题

通常,我可以在返回客户端之前执行以下操作来操作响应

app.get('/v1/users/:username', function(request, response, next) {
    var username = request.params.username;
    findUserByUsername(username, function(error, user) {
        if (error) return next(error);
        return response.render('user', user);
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用代理,我如何执行自定义逻辑,假设我想在响应客户端之前操作一些数据?有没有一个好的模式可以用这个中间件来做到这一点?

app.use('/api', proxy({target: 'http://www.example.org', changeOrigin: true}));
Run Code Online (Sandbox Code Playgroud)

这是我放在 github 中的问题的反向链接 - https://github.com/chimurai/http-proxy-middleware/issues/97

任何帮助,将不胜感激。

proxy http-proxy node.js node-http-proxy

5
推荐指数
1
解决办法
6916
查看次数

ngserve --proxy-config 与 NTLM 身份验证不起作用

我试图让 Angular cli 的内部网络服务器(我认为 webpack 使用node-http-proxy)与 NTLM 身份验证一起使用,但出现了问题。

我这样设置 webpack 代理:

// in packages.json
...
"scripts": {
    "start": "ng serve --proxy-config proxy.conf.json",
...
Run Code Online (Sandbox Code Playgroud)

proxy.config.json 的内容是:

{
  "/srv": {
    "target": "http://localhost/access_form",
    "logLevel": "debug",
    "auth": "LOGIN:PASS"
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图将 onProxyRes 函数添加到 JSON 选项对象,但这无法启动网络服务器。

有人对这个设置有过运气吗?有什么指点吗?

node-http-proxy webpack webpack-dev-server angular-cli angular

5
推荐指数
2
解决办法
8890
查看次数

如何使慢连接中间件超时并返回节点响应?

我有一个 Node 服务器,它使用 Connect 插入一些中间件,尝试转换来自 node-http-proxy 的响应流。有时,这种转换可能会非常慢,在这种情况下,最好简单地返回不包含转换或包含其部分应用程序的响应。

在我的应用程序中,我尝试在转换中间件的上下文中在几毫秒后setTimeout调用。next这通常有效,但会暴露一个竞争条件,如果中间件已经调用next然后setTimeout触发并执行相同的操作,则会出现如下错误:Error: Can't set headers after they are sent.

最终,我演变了以实例作为其第一个参数setTimeout进行调用,然后在我的中间件链中会捕获该错误并假设将开始通过 发送响应。这很有效,令人惊讶的是我可以将超时设置为几乎为零,并且响应会发生得更快并且更完整。nextErrorres.headersSentfalseres.end.call(res)

我觉得最后一种方法有点破解,并且不能免受相同竞争条件的影响,但也许看起来更有弹性。所以我想知道 Node 和 Connect 有什么样的惯用方法来处理这种事情。

我怎样才能让缓慢的中间件超时并简单地返回响应流?

目前,这似乎或多或少达到了我想要的效果,但又感觉有点恶心。

let resTimedout = false;
const timeout = setTimeout(() => {
  if (!resTimedout) {
    resTimedout = true;
    next();
  }
}, 100);


getSelectors(headers, uri, (selectors) => {
  const resSelectors = Object.keys(selectors).map((selector) => {
    ...
  };

  const rewrite = resRewrite(resSelectors);
  rewrite(req, res, () …
Run Code Online (Sandbox Code Playgroud)

javascript node.js node-http-proxy node.js-connect

5
推荐指数
1
解决办法
557
查看次数

节点代理将代理响应缓冲区转换为字符串

我正在尝试使用nodejitsu/node-http-proxy制作 HTTP 代理,并且我使用此方法来捕获代理响应

\n\n
proxy.on(\'proxyRes\', function (proxyRes, req, res) {\n    var body = new Buffer(\'\');\n    proxyRes.on(\'data\', function (data) {\n        body = Buffer.concat([body, data]);\n    });\n    proxyRes.on(\'end\', function () {\n        body = body.toString();\n        console.log("res from proxied server:", body);\n     });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里我能够得到响应,但它在缓冲区中。所以我尝试了很多方法将我的响应转换为字符串格式

\n\n

但我得到了这个\nres from proxied server: \xef\xbf\xbdAo\xef\xbf\xbd@\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdj/\xef\xbf\xbdRc\xef\xbf\xbdI\\\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd[\xc9\xa1\xef\xbf\xbdP\xef\xbf\xbd^O\xef\xbf\xbdm\xef\xbf\xbd\xef\xbf\xbdhg\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd"\xef\xbf\xbd\xc4\x89\xef\xbf\xbdJ\xef\xbf\xbdi\xef\xbf\xbdy\xef\xbf\xbd\xef\xbf\xbdg\xef\xbf\xbd\xef\xbf\xbdK\xef\xbf\xbd\xef\xbf\xbdy\xef\xbf\xbd\xef\xbf\xbd%z\xef\xbf\xbd\n\xef\xbf\xbdj:\xef\xbf\xbdJ\xef\xbf\xbd5/\xef\xbf\xbdg]\xef\xbf\xbdB\xef\xbf\xbd\xef\xbf\xbd

\n\n

如何解决这个问题

\n\n

提前致谢

\n

javascript http-proxy node.js express node-http-proxy

5
推荐指数
0
解决办法
439
查看次数