您的位置:首页 > 理论基础 > 计算机网络

Nodejs实现一个http反向代理

2014-07-04 20:06 543 查看
使用Nodejs很容易实现一个反向代理。基本思路是使用node-static查看文件是否存在本地,存在则直接返回,如果不存在则将请求转发到相应的后端服务器,dns模块对本地hosts文件内配置的域名解析会出现问题,因此使用了硬编码的hosts配置。需要npm安装模块:node-static、request。

代码如下:

var nodeStatic = require('node-static').Server;
var request = require("request");
var dns = require("dns");
var fileServer = new nodeStatic("./");
var http = require("http");
var port = 8088;
var hosts = {
'kind':'192.168.72.11',
'free':'192.168.72.29',
'cute':'192.168.72.34'
}

var resolv = function(hostname,callback){
if(/^[\d\.]+$/.test(hostname))callback(hostname);
else{
if(hosts[hostname])callback(hosts[hostname]);
else{
dns.resolve4(hostname,function(err,addresses){
if(err){
console.error(err);
callback(null);
}else callback(addresses[0]);
});
}
}
}

var httpServer = http.createServer(function(req, res) {
req.addListener('end', function() {
fileServer.serve(req, res, function(err, result) {
if (err && (err.status === 404)) {
var hoststr = req.headers.host.split(':');
var hostname = hoststr[0];

resolv(hostname,function(ip){
if(!ip){
res.writeHeader(200,'text/html');
res.write(req.url);
res.end(' request failuer.');
}else{
if(hoststr.length > 1)ip += (':'+hoststr[1])
var p = 'http://'+ip+req.url;
req.headers['Host'] = req.headers.host;
request({
method:req.method,
url:p,
headers:req.headers
}).pipe(res);
}
});
}
});
}).resume();
});

httpServer.listen(port);

console.log('proxy listen in '+port);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: