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:
El usuario solicita un recurso que tiene una propiedad
url
Esta
url
tiene el formato dehttp://www.example.com
Mi servidor, que se ejecuta en
www.pv.com
, necesita poder dirigir al usuario awww.pv.com/http://www.example.com
La respuesta HTTP devuelta junto a
www.pv.com/http://www.example.com
es una representación completa dehttp://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 });
});
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.
- Para configurar un servidor ubuntu para ejecutar Nightmare.js en modo headless, debe instalar xvfb (un servidor X) y las dependencias: 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'')