尝试使用http-proxy 1.4.3使用tuto使用自定义路由逻辑放置一个http代理,然后执行以下代码:
var httpProxy = require("http-proxy");
var url = require("url");
httpProxy.createServer(function(req, res, proxy) {
var hostname = req.headers.host.split(":")[0];
var pathname = url.parse(req.url).pathname;
// Options for the outgoing proxy request.
var options = { host: hostname };
// Routing logic
if(hostname == "127.0.0.1") {
options.port = 8083;
} else if(pathname == "/upload") {
options.port = 8082;
options.path = "/";
} else {
options.port = 8081;
}
// (add more conditional blocks here)
proxy.proxyRequest(req, res, options);
}).listen(8080);
console.log("Proxy listening on port 8080");
// We simulate the 3 target applications
var http = require("http");
http.createServer(function(req, res) {
res.end("Request received on 8081");
}).listen(8081);
http.createServer(function(req, res) {
res.end("Request received on 8082");
}).listen(8082);
http.createServer(function(req, res) {
res.end("Request received on 8083");
}).listen(8083);
如tuto所示尝试访问http://localhost:8080/anything
时,我最终会遇到以下错误
/var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:119
throw err;
^
Error: Must provide a proper URL as target
at ProxyServer.<anonymous> (/var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:68:35)
at Server.closure (/var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:125:43)
at Server.EventEmitter.emit (events.js:98:17)
at HTTPParser.parser.onIncoming (http.js:2108:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
at Socket.socket.ondata (http.js:1966:22)
at TCP.onread (net.js:525:27)
因为我是一个节点,我真的很无能为力。
答案 0 :(得分:8)
正如@BadZen在上面的评论中提到的那样,代码已经过时了,经过http-proxy自述文件后,我最终编辑了我的代码(是的,它是有效的),当然我是使用foo.loc
和bar.loc
的proxy-reverse创建apache vhosts,使它们指向localhost:9000
,但这不属于此问题的范围
var http = require('http'),
httpProxy = require('http-proxy'),
proxy = httpProxy.createProxyServer({}),
url = require('url');
http.createServer(function(req, res) {
var hostname = req.headers.host.split(":")[0];
var pathname = url.parse(req.url).pathname;
console.log(hostname);
console.log(pathname);
switch(hostname)
{
case 'foo.loc':
proxy.web(req, res, { target: 'http://localhost:9001' });
break;
case 'bar.loc':
proxy.web(req, res, { target: 'http://localhost:9002' });
break;
default:
proxy.web(req, res, { target: 'http://localhost:9003' });
}
}).listen(9000, function() {
console.log('proxy listening on port 9000');
});
// We simulate the 3 target applications
http.createServer(function(req, res) {
res.end("Request received on 9001");
}).listen(9001);
http.createServer(function(req, res) {
res.end("Request received on 9002");
}).listen(9002);
http.createServer(function(req, res) {
res.end("Request received on 9003");
}).listen(9003);