Отправлять каждый запрос с помощью node -http-proxy

Я пытаюсь настроить node -http-proxy, который просто пересылает запросы. В конце концов, этот прокси должен вводить javascript на каждом веб-сайте, который я посещаю через браузер.

В настоящее время большинство страниц пересылаются и отображаются правильно, но некоторые, например posterkoenig.ch или verkehrsclub.ch возвращает либо пустую страницу, либо на странице появляется ошибка. Оба сайта работают без прокси-сервера. Что мне нужно изменить, или что мне не хватает, что неправильно отправлено?

Im очень новый для 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...");
});

Update

Как было предложено @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

Ваша первая проблема связана с 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.ch и www.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...");
});