使用 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=woo
到 https://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 传递给玉视图?