【问题标题】:Forcing HTTPS for Node.js app on Heroku在 Heroku 上为 Node.js 应用程序强制使用 HTTPS
【发布时间】:2014-09-27 05:50:42
【问题描述】:

我在部署到 Heroku 的 node.js 应用程序上强制使用 SSL 时遇到了一些问题。我想在所有场景中强制使用 HTTPS。我也在用 Express。

我已经按照这篇文章的代码:Heroku NodeJS http to https ssl forced redirect (来自 arcseldon 的回答)。

我正在 Chrome 中进行测试。

这是我的测试场景: 如果我访问 www.mywebsite.com,它会重定向到 https://www.mywebsite.com -> 这按我的预期工作。

现在我在https://www.mywebsite.com。如果我进入 Chrome 中的 URL 并将“https”编辑为“http”,然后按 Enter。它只是通过 http 建立连接(我检查了 Chrome 开发人员工具)。

这是我的代码的 sn-ps,以防我做错了什么。

var forceSsl = function (req, res, next) {
    if ( req.headers['x-forwarded-proto'] != 'https'){
      console.log( 'forceSSL req.get = ' + req.get('Host') + ' req.url = ' + req.url );
      return res.redirect('https://' + req.get('Host') + req.url );
    } else {
      console.log( 'No need to re-direct to HTTPS' );
      next();
    }
};

if ('development' == app.get('env')) {
  console.log('Started in dev mode');
  // Other code here

} else if ('production' == app.get('env')) {
  console.log('Started in PROD mode');
  app.use(forceSsl);
  app.use('/public', express.static(__dirname + '/public'));
  app.use(express.errorHandler());
  mongoose.connect(process.env.MONGOHQ_URL);
}

附带说明,我从未在“forceSsl”函数中看到控制台消息。

我已将我的域配置为指向 heroku 应用的 SSL 版本,所以我不知道它是如何通过 HTTP 建立连接的。

非常感谢您的帮助。

编辑: 在上面我认为它在 Chrome 中工作的测试用例中,我认为 Chrome 正在干预和重定向,因此它可能无法按预期工作。

当我通过 curl 进行测试时,我可以看到该站点通过 HTTP 接受请求并且不执行重定向。

【问题讨论】:

    标签: node.js ssl heroku express


    【解决方案1】:

    我想我解决了我的问题。我正在使用一个 Google Angular 应用程序,它作为静态文件从公共目录中提供。 Express 'app.use' 中我的公共目录的声明高于我的 'app.use(forceSsl);'。

    因此,我的公共目录中的静态文件(例如我的 Angular 应用程序)在它们到达我的重新路由代码之前就已经被提供了。使用 Express,如何使用“app.use”语句的顺序很重要。

    我为我的公共目录重新订购了“app.use”,使其位于“app.use(forceSsl);”下方它似乎有效。

    希望这能帮助遇到类似问题的其他人。

    【讨论】:

      【解决方案2】:

      这是一个使用 html5 url 的完整示例:

      var express = require('express');
      var http = require('http');
      
      var app = express();
      
      app.use(express.static('' + __dirname,{index:false}));
      
      app.use('/*', function(req, res){
        if(req.headers['x-forwarded-proto']!=='https'){
          res.redirect(301, 'https://apps.iazi.ch'+req.url);
        }
        res.sendFile(__dirname + '/index.html');
      });
      
      var server = http.createServer(app);
      server.listen(process.env.PORT || 5000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-11
        • 2016-07-19
        • 1970-01-01
        • 2021-08-02
        • 2023-03-21
        • 2016-12-24
        • 2016-04-24
        • 2018-05-27
        相关资源
        最近更新 更多