【问题标题】:Force SSL with expressjs 3使用 expressjs 3 强制 SSL
【发布时间】: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 行是什么。

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

【问题讨论】:

    标签: javascript node.js ssl https express


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

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2013-04-28
      • 1970-01-01
      • 2019-04-12
      • 2017-08-22
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多