在Node中代理请求

我需要能够通过我的节点服务器提供副本网站( www.google.com , www.facebook.com等任何网站)。 我find了这个库:

https://github.com/nodejitsu/node-http-proxy

我在代理请求时使用了下面的代码:

options = { ignorePath: true, changeOrigin: false } var proxy = httpProxy.createProxyServer({options}); router.get(function(req, res) { proxy.web(req, res, { target: req.body.url }); }); 

但是,这种configuration会导致大多数站点发生错误。 根据网站,我会得到来自目标url的Unknown service错误,或者是一个Invalid host …沿着这些线的东西。 但是,当我通过

 changeOrigin: true 

我得到一个正常运行的代理服务,但我的用户的浏览器被redirect到他们的请求的实际url,而不是我的(所以如果req.body.url = http://www.google.com ,请求将转到http://www.google.com

我怎样才能让我的网站的url显示,但我可以完全复制正在显示的东西? 我需要能够添加一些JS文件到请求,我正在使用另一个库。

为了澄清,这里是问题的总结:

  1. 用户请求具有url属性的资源

  2. 这个url的格式是http://www.example.com

  3. www.pv.com运行的我的服务器需要能够引导用户访问www.pv.com/http://www.example.com

  4. www.pv.com/http://www.example.com一起返回的HTTP响应是http://www.example.com的完整表示forms。 我需要能够添加我自己的Javascript / HTML文件在这个回应以及。

       

网上收集的解决方案 "在Node中代理请求"

查看https://stackoverflow.com/a/32704647/1587329 ,唯一的区别是它使用不同的目标参数:

 var http = require('http'); var httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({}); http.createServer(function(req, res) { proxy.web(req, res, { target: 'http://www.google.com' }); }).listen(3000); 

这将解释Invalid host错误:您需要传递主机作为target参数,而不是整个URL。 因此,以下可能工作:

 options = { ignorePath: true, changeOrigin: false } var proxy = httpProxy.createProxyServer({options}); router.get(function(req, res) { var url = req.body.url; proxy.web(req, res, { target: url.protocol + '//' + url.host }); }); 

有关URL对象,请参阅NodeJS网站 。

使用无头浏览器导航到网站并获取网站的HTML。 然后发送HTML作为对请求的网站的回应。 使用无头浏览器的一个优点是它可以让你从JavaScript渲染的站点获取HTML。 Nightmare.js(一个用于electron.js的API或库)是一个不错的select,因为它使用了Electron.js。 电子框架比Phantom.js(替代scheme)更快。 使用Nightmare.js,您可以将JavaScript文件注入页面,如下面的代码片段所示。 您可能需要调整代码以添加其他function。 目前,我只允许添加两个链接,所以其他资源的链接位于代码片段中。

  • 要设置一个ubuntu服务器以无头模式运行Nightmare.js,你必须安装xvfb(一个X服务器)和依赖: https : //github.com/segmentio/nightmare/issues/224

 apt-get update && apt-get install -y xvfb x11-xkb-utils xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic x11-apps clang libdbus-1-dev libgtk2.0-dev libnotify-dev libgnome-keyring-dev libgconf2-dev libasound2-dev libcap-dev libcups2-dev libxtst-dev libxss1 libnss3-dev gcc-multilib g++-multilib 

 // example: http://hostname.com/http://www.tutorialspoint.com/articles/how-to-configure-and-install-redis-on-ubuntu-linux //X server: http://www.linfo.org/x_server.html var express = require('express') var Nightmare = require('nightmare')// headless browser var Xvfb = require('xvfb')// run headless browser using X server var vo = require('vo')// run generator function var app = express() var xvfb = new Xvfb() app.get('/', function (req, res) { res.end('') }) // start the X server to run nightmare.js headless browser xvfb.start(function (err, xvfbProcess) { if (!err) { app.get('/*', function (req, res) { var run = function * () { var nightmare = new Nightmare({ show: false, maxAuthRetries: 10, waitTimeout: 100000, electronPath: require('electron'), ignoreSslErrors: 'true', sslProtocol: 'tlsv1' }) var result = yield nightmare.goto(req.url.toString().substring(1)) .wait() // .inject('js', '/path/to/.js') inject a javascript file to manipulate or inject html .evaluate(function () { return document.documentElement.outerHTML }) .end() return result } // execute generator function vo(run)(function (err, result) { if (!err) { res.end(result) } else { console.log(err) res.status(500).end() } }) }) } }) app.listen(8080, '0.0.0.0') 

您需要拥有HTTPS,因为您提到的大多数网站都将redirect到其网站的HTTPS版本。 或许,如果你想从禁止/阻止的地方访问某些网站,而不是使用http代理,那么你最好使用SOCKS代理。