2012-05-22 45 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