如何在Express中代理外部站点

我正在试图使一个代理服务器,加载我的域名下的外部网站。 我的目标是让人们访问myDomain.com/anyDomain.com,并能够使用anyDomain.com添加function(注入JS)。

我尝试使用请求包获取该网站的HTML,然后将其发送到快速响应,但这种方法弄乱了网站(相对path,缺lessCSS,错误的JS请求等)。

有没有任何节点包完成这个任务? 如果不是,我该怎么做呢?

谢谢!

这应该让你开始,它可以让你打电话给fx http://localhost:6008/www.example.com/hello/world?foo=bar ,然后代理http://www.example.com/hello/world?foo=bar但是如果你要代理其他的网页,你会遇到各种各样的问题。

首先,这可能不合法。 我不知道规则围绕代理页面,并改变他们,你应该检查有关你的具体使用情况的法律。

其次,由于网页上的很多内容都使用绝对的URL(特别是内容使用多个域名,如CDN和API),这些资源仍然会指向原来的目的地,这可能会导致很多头痛

 var express = require('express'), http = require('http'), url = require('url'), app = express(); app.get('/:host*', function (request, response, next) { var proxyurl = url.parse(request.url); var path = request.params[0]; if (!!proxyurl.search) { path += proxyurl.search; } http.get({ host: request.params.host, path: path, headers: {} }, function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { response.end(body); }); }).on('error', function(e) { console.log("Got error: ", e); }); }); app.listen(6008); 

这可能是不合法的,所以免责声明:不要使用此代码。

以下是一个非常黑客的例子,你可以通过使用cookie来跟踪任何相关url的代理主机。

基本上任何时候URLpath匹配/*.com/*我们设置运行正则expression式,并设置一个cookie proxy_host只是任何匹配*.com 。 如果urlpath不匹配,我们检查是否设置了cookie proxy_host 。 如果是这样,我们将urlpath放到cookie proxy_host并代理该url。

 var app = require('express')(); var request = require('request'); var cookieParser = require('cookie-parser'); var HOST_RE = /([^/]+\.com)/; app.use(cookieParser()); app.use(function(req, res) { // Check if the url matches *.domain/www.somehost.com/* if (HOST_RE.test(req.path)) { // get a match for the host only, no paths var proxyHost = HOST_RE.exec(req.path)[0]; // clean the path of the host, so that we can proxy the exact // page the user requested var path = req.path.replace(proxyHost, ''); // We have to cache the body in this instance because before we // send the proxied response, we need to set our cookie `proxy_host` var body = ''; return request.get('http://' + proxyHost + path) .on('data', function(data) { body += data; }) .on('end', function() { res.cookie('proxy_host', proxyHost); res.end(body); }); } // Url does not match *.domain/www.somehost.com/* // most likely a relative url. If we have the `proxy_host` // cookie set, just proxy `http://` + proxy_host + `req.path` if (req.cookies && req.cookies.proxy_host) { return request.get('http://' + req.cookies.proxy_host + req.path).pipe(res); } // otherwise 404 res.status(404).end(); }); app.listen(8000);