使用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)
当你运行代理时,它会:
通过代理访问演示目标时,它将“Ruby”字符串修改为“nodejitsu”,以便于测试。 如果您位于企业防火墙/代理的后面,则此脚本现在失败。
更新 :“标题已发送”的问题是在32/33行。 事实证明,在同一个连接上发生了几个错误。 发生第一个错误时,会发送标题,当发生第二个错误时,标题已经发送; 结果“头已发送”异常被引发并且服务器被终止。
有了这个修复程序,服务器不再会死掉,但它仍然不能修复错误的来源,这就是NODE.JS无法到达您的目标站点。 您必须位于另一个代理/防火墙之后,并且NodeJS需要将HTTP请求转发给另一个代理。 如果您通常在浏览器中使用代理连接到Internet,我的解决方案将失败。 不过,您并未指定这是一项要求。
您可以通过我的代理访问您的网络中的服务器来验证这一点(通常无需代理服务器)。
UPDATE2 :你不应该尝试直接访问http://localhost:8013
,而是将它设置为浏览器中的代理。 注意您的原始浏览器代理设置(请参阅上文)。 尝试访问http://localhost:9013
。
您是否将该代理添加到您的浏览器配置中? 否则,底层操作系统会将您的请求直接发送到www.stackoverflow.com
并且您的代理无法捕获该请求。
上一篇: Redirect an http request from a remote server to a local server using nodejs