使用nodejs将来自远程服务器的http请求redirect到本地服务器

在名为charles的工具中有一项function,可以让您映射远程请求:

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

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

我只是想知道是否有一个节点模块可以做到这一点。 我尝试使用HTTP代理,但我有一个感觉,这个地图远程工具是有点不同于代理,因为它看起来像你必须拥有一个代理服务器。

编辑:试图再次使用HTTP代理节点模块,但似乎无法得到它的工作。 这是我的代码:

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,它将redirect到我的本地主机:9000

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

你提到的代理模块可以正常工作,还有很多。 如果你愿意的话,你也可以用简单的Nginxconfiguration来做到这一点。

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

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

当你运行代理时,它将会:

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

当通过代理访问演示目标时,它将“Ruby”string修改为“nodejitsu”,以便于testing。 如果您在企业防火墙/代理之后,此脚本现在失败。

更新 :“头已经发送”的问题是在32/33行。 事实certificate,在同一个连接上发生了几个错误。 发生第一个错误时,会发送标题,当发生第二个错误时,标题已经发送; 结果“头已发送”exception引发,服务器被终止。

有了这个修复,服务器不再死了,但它仍然不能修复错误的来源,这是NODE.JS无法到达您的目标网站。 您必须位于另一个代理/防火墙的后面,并且NodeJS需要将HTTP请求转发给另一个代理。 如果您通常在浏览器中使用代理连接到Internet,我的解决scheme将失败。 不过,您并没有指定这是一个要求。

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

UPDATE2 :你不应该尝试直接访问http://localhost:8013 ,而是在你的浏览器中设置它为代理。 注意你的原始浏览器代理设置(见上)。 尝试访问http://localhost:9013

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

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