2013-03-09 39 views
1

我使用Node.js爲iPhone客戶端製作API服務器。我也使用這個節點服務器發送一些請求的文件,如靜態圖像等。Node.js https API服務器,但HTTP爲靜態文件

現在我創建一個HTTPS服務器用下面的代碼:

https.createServer(options,app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

工作正常。

但是,我想通過HTTP而不是HTTPS提供靜態文件。這可能嗎?

我服務的靜態文件與下面的代碼:

app.use(express.static(path.join(__dirname, 'uploads'))); 

謝謝!

回答

4

如果您想在同一端口上執行此操作,則這幾乎是Binding HTTP and HTTPS traffic on the SAME port in node.js?的重複。

但是,如果您有多個端口(一個用於HTTP,另一個用於HTTPS),則可以嘗試啓動服務器的兩個實例。創建兩個應用程序(可以在同一個節點文件中完成),一個用於實際API,然後是一個稱爲staticApp的較小應用程序,用於提供靜態內容。然後你開始你的API服務器的代碼是一樣的,你可以只使用

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Static server listening on port " + app.get('port')); 
}); 

爲了避免混亂,你也可以在你的API服務器改變「端口」變量的名稱是類似「SSL-港口',所以你不會感到困惑。

這將有效地創建兩個服務器;一個通過HTTP爲您的靜態內容提供服務,並使您的原始API服務器通過HTTPS服務。只要確保你使用的是80/443(標準),使端口由協議impliclty解釋(即http://mydomain.comhttps://mydomain.com去正確的地方),或您的負載均衡或無論是進行代理你的流量發送正確的協議到正確的端口。

請注意,這將給嘗試通過HTTP訪問API的任何人提供404(最有可能)。解決方案可能是添加與您的API端點匹配的通用路由(類似於api/*,如果這就是您的結構設置的那樣),將用戶重定向到使用https協議的相同路徑。

在回答您的評論

兩個做在一個文件中的兩個應用程序,只是這樣做:

var api = express(); 

api.configure(function(){ 
    app.set('ssl_port', [your https port]); 
    //your api code 
}); 


var static = express(); 

static.configure(function() { 
    app.set('port', [your http port]); // Set the port 
    app.use(express.static(path.join(__dirname, 'static'))); //This will serve everything inside '/static' as static content 
}) 

太創建兩個服務器:

//HTTPS Api Server 
https.createServer(https_options, app).listen(app.get('ssl_port'), function(){ 
    console.log("Api server listening on port " + app.get('ssl_port')); 
}); 

//HTTP Static Server 
http.createServer(static).listen(static.get('port'), function() { 
    console.log('Static server listening on %s', static.get('port')); 
}); 
+0

謝謝你答案!我想澄清一下如何在同一個app.js文件中創建兩個應用程序。對不起,我是新來的節點,所以我不知道如何重構我現有的app.js文件。 – kurisukun 2013-03-10 00:13:21

+0

我在答案中加入了一個例子 – 2013-03-10 00:25:24

相關問題