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

Node.js 使用nodejs将http请求从远程服务器重定向到本地服务器,node.js,remote-server,charles-proxy,Node.js,Remote Server,Charles Proxy,名为charles的工具中有一项功能,允许您映射远程请求: 基本上,它可以向服务器发送任何请求(即使不是运行它的人),然后向另一台服务器发出新请求,保留路径和查询字符串。然后,来自第二台服务器的响应将覆盖来自第一台服务器的响应 我只是想知道是否有一个节点模块可以做到这一点。我尝试使用http代理,但我感觉这个map remote工具与代理有点不同,因为它似乎必须拥有两台服务器和一个代理 编辑:再次尝试使用http代理节点模块,但似乎无法使其工作。这是我的密码: var http = requi

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

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

我只是想知道是否有一个节点模块可以做到这一点。我尝试使用http代理,但我感觉这个map remote工具与代理有点不同,因为它似乎必须拥有两台服务器和一个代理

编辑:再次尝试使用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配置来完成此操作。

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

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

我用我的解决方案制作了这个粘贴箱:

将pastebin的内容另存为proxy.js。确保将依赖项安装在proxy.js文件所在的文件夹中。(npm安装http代理连接util--save)

运行代理时,它将:

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

更新:第32/33行出现了“已发送邮件头”的问题。结果表明,在同一个连接上发生了多个错误。当第一个错误发生时,将发送头,当第二个错误发生时,已发送头;因此,将引发“headers ready sent”异常,并终止服务器

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

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


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

我做了更多的研究,这不是一个简单的代理,而是一个反向代理吗?@prashn64不,只是一个代理服务器。事实是,“反向代理”一词几乎毫无意义。通常,当您将代理服务器放在服务器旁边以实现负载平衡(除其他外)时,会使用该术语。不过,这只是一个代理服务器。您已在问题中添加了更多信息。。。您是否设置了主机文件条目,指向Node.js服务器拥有的任何IP?如果可能,我不希望更改此配置。路由表不应该处理这个问题吗?这里有些东西你弄糊涂了。路由表只在IP网络之间设置路由。这绝对与DNS解析无关。如果希望服务器处理www.stackoverflow.com的流量,则www.stackoverflow.com必须解析为服务器的IP地址。您可以配置DNS服务器(如果希望此更改与多个服务器一起使用),也可以设置主机文件条目(覆盖DNS)。或者,在服务器中设置常规代理,并更改计算机的代理设置以使用它。你认为Charles是如何工作的?@prashn64 Charles只是一个代理服务器。运行时,它会将自身设置为系统代理服务器。如果希望其他计算机使用代理服务器,则必须对其进行配置。如果您希望您的计算机在没有代理的情况下为某些地址使用备用服务器,则必须重新配置它们使用的任何DNS服务器。这与您的应用程序无关。。。它取决于DNS服务器。现在我还不清楚您想做什么。我收到了这个错误:
http.js:645抛出新错误('发送后无法设置头')
这是因为防火墙问题吗?^这是我尝试连接到localhost:8013 btw的时候。我尝试了您的更新,确实不再收到这些错误。然而,我仍然没有得到修改过的“Ruby”->“nodejitsu”文本更改。另外,当我点击stackoverflow.com时,我没有被重定向到localhost:9013。我检查了我的浏览器代理,但似乎没有设置任何内容。代理服务器设置为浏览器和正在访问的服务器之间的中间人时,代理服务器就会工作。在访问stackoverflow.com之前,您必须将浏览器设置为使用localhost:8013上的代理服务器,否则您将看到正常的浏览器行为