独角兽企业重金招聘Python工程师标准>>>
使用Nodejs很容易实现一个反向代理。基本思路是使用node-static查看文件是否存在本地,存在则直接返回,如果不存在则将请求转发到相应的后端服务器,dns模块对本地hosts文件内配置的域名解析会出现问题,因此使用了硬编码的hosts配置。需要npm安装模块:node-static、request。
代码如下:
varnodeStatic=require('node-static').Server;varrequest=require("request");vardns=require("dns");varfileServer=newnodeStatic("./");varhttp=require("http");varport=8088;varhosts={'kind':'192.168.72.11','free':'192.168.72.29','cute':'192.168.72.34'}varresolv=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);}elsecallback(addresses[0]);});}}}varhttpServer=http.createServer(function(req,res){req.addListener('end',function(){fileServer.serve(req,res,function(err,result){if(err&&(err.status===404)){varhoststr=req.headers.host.split(':');varhostname=hoststr[0];resolv(hostname,function(ip){if(!ip){res.writeHeader(200,'text/html');res.write(req.url);res.end('requestfailuer.');}else{if(hoststr.length>1)ip+=(':'+hoststr[1])varp='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('proxylistenin'+port);