13

我正在尝试设置一个仅转发请求的 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.hostreq.headers.url

海报科尼希

现在抛出:

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...");
});
4

1 回答 1

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,harmon是一个中间件,node-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...");
});
于 2013-05-06T06:42:20.447 回答