用expressjs强制SSL 3

Har*_*rry 27 javascript ssl https node.js express

我正在运行一个node.js表示没有代理并使用SSL的3服务器.

我试图找出如何强制所有连接通过https.

谷歌搜索向我显示:

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

目前没有办法强制https重定向,虽然这似乎有点奇怪的解决方法.我们有一个仅限https的应用程序,我们只有一个简单的~4行节点http服务器重定向,没什么特别的

这就是我需要的,但他并没有说这四行是什么.

我们如何做到这一点?谢谢.

Pie*_*rre 80

当只有一个服务器可以完美地完成工作时,我真的不明白启动两台服务器的重点.例如,通过在服务器文件中添加一个简单的中间件:

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

这会将任何非安全请求重定向到相应的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+连接字符串快一点.没什么戏剧性的,但每一次胜利都是胜利......

  • 我尝试过,似乎你仍然需要创建一个http服务器才能使它工作,基本上是2台服务器.这很好,这个答案有效. (3认同)
  • 对于使用较新版本的Express(4.x)的任何人,您需要更新重定向以使用`baseUrl`而不是`url`.该行应为:`return res.redirect(['https://',req.get('Host'),req.baseUrl] .join(''));` (3认同)
  • @Pierre 我看到 ERR_TOO_MANY_REDIRECTS (2认同)