使用 expressjs 3 强制 SSL

Posted

技术标签:

【中文标题】使用 expressjs 3 强制 SSL【英文标题】:Force SSL with expressjs 3 【发布时间】:2012-05-28 16:27:54 【问题描述】:

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

我正在尝试弄清楚如何强制所有连接通过 https。

Google 搜索显示:

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

目前没有办法强制 https 重定向,虽然这看起来 就像一个奇怪的解决方法。我们有一个仅限 https 的应用程序,我们 只是有一个简单的 ~4 行节点 http 服务器来重定向,什么都没有 花哨的

这是我需要的,但他没有说那 4 行是什么。

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

【问题讨论】:

【参考方案1】:

您应该创建第二个服务器监听 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);

【讨论】:

这将重定向所有流量,甚至是现有的 https 流量? 这绝对可以,但是如果用户请求另一个带有“/”的页面,这种方法就不起作用。在这种情况下,他只会得到一个令人不安的 404 错误。【参考方案2】:

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

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 在连接字符串方面比+ 快一点。没什么戏剧性的,但每次胜利都是胜利......

【讨论】:

我试过了,看来您仍然需要创建一个 http 服务器才能使其正常工作,基本上是 2 个服务器。这很好,这个答案有效。 是的。我的意思是两段不同的代码,很抱歉造成混淆。或者,只有一个带有一些代理服务器/负载平衡器的应用程序 =) 对于使用较新版本 Express (4.x) 的任何人,您需要更新重定向以使用 baseUrl 而不是 url。该行应为:return res.redirect(['https://', req.get('Host'), req.baseUrl].join('')); @Pierre 这工作正常,除了一种情况,即计算机第一次加载没有任何前缀示例“portal.abcd.xyz”的url,在这种情况下,如果我们加载portal.abcd.xyz重新加载它重定向到 https 的页面 @Pierre 我看到 ERR_TOO_MANY_REDIRECTS【参考方案3】:

我有类似的问题,重定向解决方案不适合我,因为本质上我想摆脱浏览器的不安全警告,

所以我没有重定向每条消息,而是这样做了:

app1 = new express()
app1.get('/', function(req, res) 
res.sendFile(path.join(__dirname + '/redirect.html'));

); app1.listen(80, function()'重定向服务器运行在80端口')

redirect.html 中只是一个重定向的 html 文件:

<meta http-equiv="refresh" content="0; URL='https://my-site.com'" />

当然,当你想要重定向所有路由时,这不适用于复杂的情况,但对我来说,我只想将我的主页重定向到我的 https 主页并摆脱浏览器的不安全警告。希望这对某人有帮助!

【讨论】:

以上是关于使用 expressjs 3 强制 SSL的主要内容,如果未能解决你的问题,请参考以下文章

ExpressJS 3.0 如何将 res.locals 传递给玉视图?

ExpressJS 连接到回调的多个中间件

使用 Visual Studio Code 调试 ExpressJS 服务器端代码

ExpressJs与NodeJs版本的兼容性

使用 ExpressJS 重写 URL

使用 DBRef 示例嵌入 ExpressJS 和 Mongoose Schema