2012-05-22 42 views
22

我正在運行沒有代理和使用SSL的node.js express 3服務器。強制SSL與expressjs 3

我想弄清楚如何強制所有連接通過https。

谷歌搜索顯示了我:

https://groups.google.com/forum/#!topic/express-js/Bm6yozgoDSY

目前還沒有任何辦法強迫HTTPS重定向功能,儘管這似乎 像一個有點陌生的變通。我們有一個HTTPS的唯一的應用程序,我們 只是重定向簡單〜4號線節點的http服務器,沒有什麼花哨的

這正是我需要的,但他並沒有說什麼這4條線的。

我們如何做到這一點?謝謝。

回答

62

我真的不明白的點啓動兩臺服務器時,只有一個可以做的工作完美。例如,通過在服務器文件中添加一個簡單的中間件:

app.use(function(req, res, next) { 
    if(!req.secure) { 
    return res.redirect(['https://', req.get('Host'), req.url].join('')); 
    } 
    next(); 
}); 

這將重定向任何非安全請求到相應的HTTPS網頁。例如,http://example.com/https://example.com/http://example.com/foo?bar=woohttps://example.com/foo?bar=woo。這絕對是我期望的行爲。也許你應該按主機進行過濾,所以它只能重定向到你擁有並安裝了合適證書的域。

如果您的應用程序在Nginx之類的另一臺服務器之後運行,您可能需要添加配置參數app.set('trust proxy', true)。或者,更好的做法是讓Nginx自己做重定向,這比任何Node.js應用程序都更有效率。

編輯:根據我的基準,join比連接字符串的+稍快。沒有戲劇性的,但每一場勝利都是贏...

+2

我試過了,它似乎仍然需要創建一個http服務器爲了這個工作,基本上2臺服務器。這很好,而且這個答案很有效。 – Harry

+0

是的。我的意思是兩段不同的代碼,對於混淆感到抱歉。或者,只有一個具有代理服務器/負載均衡器的應用程序=) – Pierre

+0

@prx您建議的編輯被拒絕,因爲它應作爲新答案發布,而不是編輯現有答案。 –

0

你應該創建第二個服務器監聽80和301頭重定向到HTTPS服務器:

var express = require('express'); 
var app = express(); 

app.get('/', function(req, res, next){ 
    res.redirect('https://' + app.address().address) 
}); 

app.listen(80); 
+1

那會重定向所有流量,即使是現有的https流量? – Harry

+2

這絕對可行,但如果用戶請求另一個「/」頁面,則此方法不起作用。在這種情況下,他會得到令人不安的404錯誤。 – Pierre