使用nodejs将http请求从远程服务器重定向到本地服务器

时间:2014-01-26 05:06:01

标签: node.js remote-server charles-proxy

名为charles的工具中有一项功能允许您映射远程请求:

http://www.charlesproxy.com/documentation/tools/map-remote/

基本上,它可以向服务器发送任何请求(即使您不是运行它的那个),然后向另一个服务器发出新请求,保留路径和查询字符串。然后,第二台服务器的响应将覆盖第一台服务器的响应。

我只是想知道是否有可以执行此操作的节点模块。我尝试使用http-proxy,但我觉得这个地图远程工具与代理有点不同,因为看起来你必须拥有两个带代理的服务器。

编辑:再次尝试使用http-proxy节点模块,但似乎无法使其工作。这是我的代码:

var http = require('http')
, httpProxy = require('http-proxy');

httpProxy.createServer({
    hostnameOnly: true,
    router: {
        'www.stackoverflow.com': 'localhost:9000',
    }
}).listen(80);

// Create your target server
//
http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(9000);

我的期望是,当我访问www.stackoverflow.com或www.stackoverflow.com:80时,它将改为重定向到我的localhost:9000

4 个答案:

答案 0 :(得分:4)

不,你所要求的确实是一个简单的代理。不,您不必“拥有”两台服务器来运行代理。您只需代理请求,然后您可以根据需要修改数据。

您提到的代理模块可以正常工作,还有很多其他模块。如果您愿意,也可以使用简单的Nginx配置执行此操作。

答案 1 :(得分:3)

我用我的解决方案制作了这个pastebin: http://pastebin.com/TfG67j1x

将pastebin的内容保存为proxy.js。确保将依赖项安装在与proxy.js文件相同的文件夹中。 (npm安装http-proxy颜色连接util --save)

运行代理时,它将:

  • 启动一个侦听8013的新服务器,充当代理服务器;
  • 启动一个在9013收听的演示目标服务器。

通过代理访问演示目标时,它将“Ruby”字符串修改为“nodejitsu”,以便于测试。如果您位于公司防火墙/代理之后,此脚本现在将失败。

更新:“已发送标头”的问题位于第32/33行。事实证明,在同一个连接上发生了几个错误。发生第一个错误时,将发送标头,当发生第二个错误时,标头已经发送;结果,引发了“已发送标头”异常,并且服务器被终止。

通过此修复,服务器不再死机,但它仍然无法修复错误的来源,即NODE.JS无法访问您的目标站点。您必须在另一个代理/防火墙后面,NodeJS需要将HTTP请求转发到第二个代理。如果您通常在浏览器中使用代理连接到Internet,我的解决方案将失败。但是,您没有将此指定为要求。

您可以通过我的代理访问您网络中的服务器来验证这一点(通常不需要代理)。

UPDATE2 :您不应尝试直接访问http://localhost:8013,而应将其设置为浏览器中的代理。注意您的原始浏览器代理设置(见上文)。然后尝试访问http://localhost:9013

答案 2 :(得分:1)

您是否在浏览器配置中添加了该代理?否则,底层操作系统会将您的请求直接路由到www.stackoverflow.com,并且您的代理无法捕获该请求。

答案 3 :(得分:1)

您能否确认www.stackoverflow.com最终会在您的node.app上结束?该名称当前将解析为引导您访问此网站的IP地址,因此您必须确保该名称现在解析为您的node.app。在这种情况下,这可能意味着编辑您的主机文件。