quitar nodejs node example node.js proxy

node.js - nodejs - npm http-proxy



Peticiones de proxies en Nodo (3)

Necesito poder ofrecer sitios de réplica (a www.google.com , www.facebook.com , etc. cualquier sitio) a través de mi servidor de nodos. Encontré esta biblioteca:

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

Y utilicé el siguiente código al enviar solicitudes de proxy:

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

Sin embargo, esta configuración causa un error en la mayoría de los sitios. Dependiendo del sitio, recibiré un error del Unknown service proveniente de la URL de destino, o un Invalid host ... algo similar a eso. Sin embargo, cuando paso

changeOrigin: true

Obtengo un servicio proxy en funcionamiento, pero mi navegador del usuario se redirecciona a la URL real de su solicitud, no a la mía (por lo que si req.body.url = http://www.google.com , la solicitud irá a http://www.google.com )

¿Cómo puedo hacerlo para que se muestre la URL de mi sitio, pero para poder copiar exactamente lo que se muestra? Necesito poder agregar algunos archivos JS a la solicitud, lo cual estoy haciendo usando otra biblioteca.

Para aclarar, aquí hay un resumen del problema:

  1. El usuario solicita un recurso que tiene una propiedad url

  2. Esta url tiene el formato de http://www.example.com

  3. Mi servidor, que se ejecuta en www.pv.com , necesita poder dirigir al usuario a www.pv.com/http://www.example.com

  4. La respuesta HTTP devuelta junto a www.pv.com/http://www.example.com es una representación completa de http://www.example.com . Necesito poder agregar mis propios archivos Javascript / HTML en esta respuesta también.


Debe tener HTTPS, ya que la mayoría de los sitios web que ha mencionado redirigirán a su versión HTTPS de su sitio web. Quizás, en lugar de hacer un proxy HTTP, usted sea mejor con el proxy SOCKS si desea proporcionar acceso a algunos sitios web desde lugares donde están prohibidos / bloqueados.


En https://.com/a/32704647/1587329 , la única diferencia es que usa un parámetro de destino diferente:

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);

Esto explicaría el Invalid host : debe pasar un host como el parámetro de target , no la URL completa. Por lo tanto, lo siguiente podría funcionar:

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

Para el objeto URL, consulte el sitio web NodeJS .


Use un navegador sin cabeza para navegar al sitio web y obtener el HTML del sitio web. A continuación, envíe el HTML como respuesta para el sitio web solicitado. Una ventaja de usar un navegador sin cabeza es que le permite obtener el HTML de los sitios procesados ​​con JavaScript. Nightmare.js (una API o biblioteca para electron.js) es una buena opción porque usa Electron.js bajo el capó. El marco de electrones es más rápido que Phantom.js (una alternativa). Con Nightmare.js puede insertar un archivo JavaScript en la página como se muestra en el siguiente fragmento de código. Es posible que necesite modificar el código para agregar otras características. Actualmente, solo puedo agregar dos enlaces, por lo que los enlaces a otros recursos se encuentran en el fragmento de código.

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'')