使用node-http-proxy转发每个请求

时间:2013-05-05 22:22:37

标签: javascript node.js http-proxy node-http-proxy

我正在尝试设置一个只转发请求的node-http-proxy。 最后,这个代理应该在我通过浏览器访问的每个网站中注入javascript ..

现在,大多数网页都会被正确转发和显示,但有些网页(例如posterkoenig.chverkehrsclub.ch)会返回空白页面或网页上出现错误。两个站点都可以在没有代理的情况下正常运行我需要更改什么,或者我错过了哪些内容未正确转发?

我是nodejs的新手,甚至不确定我的方法是否有效。

这是我到目前为止所得到的:

var httpProxy = require('http-proxy');
var url = require('url');

httpProxy.createServer(function(req, res, proxy) {

  var urlObj = url.parse(req.url);

  proxy.proxyRequest(req, res, {
    host: urlObj.host,
    port: 80,
    changeOrigin: true,
    enable : { xforward: true }
  });
}).listen(9000, function () {
  console.log("Waiting for requests...");
});

更新

根据@robertklep的建议,我删除了changeOrigin并重新定义了req.headers.host以及req.headers.url

posterkoenig.ch

现在抛出:

An error has occurred: 
{"code":"ENOTFOUND","errno":"ENOTFOUND","syscall":"getaddrinfo"}

verkehrsclub.ch

首页现在可以使用,但是子页面仍会在页面上抛出错误。

var httpProxy = require('http-proxy');
var url = require('url');

httpProxy.createServer(function(req, res, proxy) {

  var urlObj = url.parse(req.url);

  req.headers['host'] = urlObj.host;
  req.headers['url'] = urlObj.href;

  proxy.proxyRequest(req, res, {
    host: urlObj.host,
    port: 80,
    enable : { xforward: true }
  });
}).listen(9000, function () {
  console.log("Waiting for requests...");
});

1 个答案:

答案 0 :(得分:15)

您的第一个问题与changeOrigin有关:它会向远程服务器发送一个Host标头,其中包含一个端口号,您提到的这两个网站都无法处理。

相反,试试这个:

req.headers.host = urlObj.host;
req.url          = urlObj.path;
proxy.proxyRequest(req, res, {
  host: urlObj.host,
  port: 80,
  enable : { xforward: true }
});

至于你的其他问题,我认为它可能与那些不以UTF-8提供内容的网站有关(如果你没有通过编码,.toString()将使用的编码)。它会一直发生,还是只发生在一些网站上?

FWIW,harmonnode-http-proxy的中间件,它提供了一种重写响应的好方法。对你的情况来说可能是一种矫枉过正,但它也可能解决你的问题。

编辑:这是一个最小的示例,似乎对posterkoenig.chwww.verkehrsclub.ch(主页以及子页面)都很好:

var httpProxy = require('http-proxy');
var url       = require('url');

httpProxy.createServer(function(req, res, proxy) {
  var urlObj = url.parse(req.url);

  req.headers.host  = urlObj.host;
  req.url           = urlObj.path;

  proxy.proxyRequest(req, res, {
    host    : urlObj.host,
    port    : 80,
    enable  : { xforward: true }
  });
}).listen(9000, function () {
  console.log("Waiting for requests...");
});