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

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

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

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

我只想知道是否有一个节点模块可以做到这一点。 我尝试使用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时,它将改为重定向到我的localhost:9000


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

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


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

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

当你运行代理时,它会:

  • 在8013上启动一个新的服务器,充当代理服务器;
  • 启动在9013处侦听的演示目标服务器。
  • 通过代理访问演示目标时,它将“Ruby”字符串修改为“nodejitsu”,以便于测试。 如果您位于企业防火墙/代理的后面,则此脚本现在失败。

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

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

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

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


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

    链接地址: http://www.djcxy.com/p/15733.html

    上一篇: Redirect an http request from a remote server to a local server using nodejs

    下一篇: How can I redirect maintenance site in asp.net