27

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

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

谷歌搜索向我展示了这一点:

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

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

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

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

4

3 回答 3

84

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

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

于 2012-05-23T08:01:39.913 回答
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);
于 2012-05-22T09:43:31.870 回答
0

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

因此,我没有重定向每条消息,而是:

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 主页并摆脱浏览器的不安全警告。希望这对某人有帮助!

于 2019-03-17T23:12:13.113 回答