2012-06-07 63 views
3

我想做一個簡單的node.js反向代理到相同的端口80上承載多個應用程序的Node.js和我的Apache服務器一起於是我發現了這個例子here使用node-http-proxy的默認路由?

var http = require('http') 
, httpProxy = require('http-proxy'); 

httpProxy.createServer({ 
    hostnameOnly: true, 
    router: { 
     'www.my-domain.com': '127.0.0.1:3001', 
     'www.my-other-domain.de' : '127.0.0.1:3002' 
    } 
}).listen(80); 

的問題是,我想例如app1.my-domain.com指向localhost:3001,app2.my-domain.com指向localhost:3002,其他所有指向端口3000,例如,我的Apache服務器將運行。在關於如何擁有「默認」路線的文檔中,我找不到任何東西。

任何想法?

編輯我想這樣做,因爲我有很多由我的apache服務器處理的域/子域,並且我不想在每次需要添加新的子域時都修改此路由表。

回答

10

近一年來,我成功地使用了接受回答有一個默認的主機,但現在有一個更簡單的方法,即node-http-prox y允許在主機表中使用RegEx。

var httpProxy = require('http-proxy'); 

var options = { 
    // this list is processed from top to bottom, so '.*' will go to 
    // '127.0.0.1:3000' if the Host header hasn't previously matched 
    router : { 
    'example.com': '127.0.0.1:3001', 
    'sample.com': '127.0.0.1:3002', 
    '^.*\.sample\.com': '127.0.0.1:3002', 
    '.*': '127.0.0.1:3000' 
    } 
}; 

// bind to port 80 on the specified IP address 
httpProxy.createServer(options).listen(80, '12.23.34.45'); 

的要求,你沒有hostnameOnly設置爲true,否則正則表達式將不會被處理。

+0

謝謝。那麼我會接受這個答案,因爲它更新。 –

+1

看起來就像這個答案一樣,該功能已經轉移到一個單獨的模塊http-proxy-rules。 https://github.com/donasaur/http-proxy-rules – Daniel

+0

顯然''路由器'很久以前就被刪除了。 https://blog.nodejitsu.com/node-http-proxy-1dot0/ – galki

3

這不是烤到節點的HTTP代理,但它是簡單的代碼:

var httpProxy = require('http-proxy'), 
    http = require('http'), 
    addresses; 

    // routing hash 
addresses = { 
    'localhost:8000': { 
    host: 'localhost', 
    port: 8081 
    }, 
    'local.dev:8000': { 
    host: 'localhost', 
    port: 8082 
    }, 
    'default': { 
    host: 'xkcd.com', 
    port: 80 
    } 
}; 

// create servers on localhost on ports specified by param 
function createLocalServer(ports) { 
    ports.forEach(function(port) { 
    http.createServer(function (req, res) { 
     res.writeHead(200, {'Content-Type': 'text/html'}); 
     res.end('<h1>Hello from ' + port + '</h1'); 
    }).listen(port); 
    }); 
    console.log('Servers up on ports ' + ports.join(',') + '.'); 
} 
createLocalServer([8081, 8082]); 

console.log('======================================\nRouting table:\n---'); 
Object.keys(addresses).forEach(function(from) { 
    console.log(from + ' ==> ' + addresses[from].host + ':' + addresses[from].port); 
}); 

httpProxy.createServer(function (req, res, proxy) { 
    var target; 

     // if the host is defined in the routing hash proxy to it 
     // else proxy to default host 
    target = (addresses[req.headers.host]) ? addresses[req.headers.host] : addresses.default; 

    proxy.proxyRequest(req, res, target); 
}).listen(8000); 

如果你訪問端口8000本地主機將代理到本地主機端口8081

如果您請訪問端口8000上的127.0.0.1(未在我們的路由哈希中定義),它將轉到默認「位置」,即端口80上的xkcd.com。

+1

它的工作原理非常感謝! –