在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文件到请求,我正在使用另一个库。
为了澄清,这里是问题的总结:
-
用户请求具有
url
属性的资源 -
这个
url
的格式是http://www.example.com
-
在
www.pv.com
运行的我的服务器需要能够引导用户访问www.pv.com/http://www.example.com
-
与
www.pv.com/http://www.example.com
一起返回的HTTP响应是http://www.example.com
的完整表示forms。 我需要能够添加我自己的Javascript / HTML文件在这个回应以及。
查看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代理。