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

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

我正在尝试设置一个仅转发请求的 node-http-proxy。 最后,这个代理应该在我通过浏览器访问的每个网站中注入(inject) 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...");
});

最佳答案

您的第一个问题与 changeOrigin 相关:这会将 Host header 发送到包含端口号的远程服务器,并且您提到的两个站点都无法处理那个。

相反,试试这个:

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

关于javascript - 使用 node-http-proxy 转发每个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389728/

相关文章:

javascript - 如何控制使用浏览器后退按钮的网站页面访问

ubuntu - 如何在 Ubuntu 上设置具有密码保护的 Elite HTTP Squid 代理?

javascript - 绘制 100 个带 ID 的圆圈并将鼠标事件与它们相关联

javascript - 在 native 浏览器获取中设置授权

Node.js:为每个请求创建一个全局 SOAP 客户端或一个客户端

arrays - Sequelize 数据库错误: operator does not exist: character varying[] @> character varying

node.js - 使用 Node 从图形 api 获取数据

ruby - 使用通用 CA 动态创建 SSL 证书/ key

TFS vNext 构建代理失败并出现 407 代理身份验证错误

javascript - this.url 不是函数