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

我试图设置一个节点HTTP代理只是转发请求。 最后,这个代理应该在通过浏览器访问的每个网站中注入javascript。

现在,大多数页面都被正确地转发和显示,但是一些例如posterkoenig.ch或者verkehrsclub.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..."); }); 

更新

正如@robertklepbuild议,我删除了changeOrigin并重新定义了req.headers.hostreq.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头到包含端口号的远程服务器,而你提到的两个站点都不能处理这个问题。

相反,试试这个:

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