5

一个名为 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

4 回答 4

4

不,您要求的确实是一个简单的代理。不,您不必“拥有”两台服务器即可运行代理。您只需代理请求,此时您可以随意修改数据。

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

于 2014-01-26T05:08:47.607 回答
3

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

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

当您运行代理时,它将:

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

通过代理访问demo目标时,会将“Ruby”字符串修改为“nodejitsu”,方便测试。如果您在公司防火墙/代理后面,则此脚本暂时失败。

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

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

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

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

于 2014-02-02T10:05:44.807 回答
1

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

于 2014-01-31T10:40:47.937 回答
1

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

于 2014-01-31T09:21:40.013 回答